Recently I have heard statements like "you should never use wildcard imports" too often. So I want to ask community about this. Should wildcard imports really never ever be used in Java production code, no matter what? Are there exceptions to this rule? I interested in your personal experience and opinion. Do you use them in your production code and would you recommend it to others? How do you use them - can you recommend the best way to make it.
It also interesting to look at it from Scala perspective. Is the same applies to Scala? Or wildcard imports in Scala should be only used in presentation slides and SO answers?
If you will look at scalaz page, for example, they recommend usage of wildcard imports like:
import scalaz._
import Scalaz._
I think it also important to consider implicit conversions that are normally imported with wildcards.
解决方案
In Scala, wildcard imports are a must, since many libraries expect their implicit conversions to be in scope, but they're not always conveniently named. So,
import collection.JavaConversions._
is a great idea, whereas
import collection.JavaConversions.{asJavaConcurrentMap,enumerationAsScalaIterator,...}
is incredibly awkward. Better yet, in Scala you can put your imports in any scope:
package mypackage {
class MyClass {
def myGraphicalWidgetHandler {
import java.awt._
...
}
...
}
...
}
which really helps keep the namespace clutter down throughout the whole file. And you can selectively rename parts of the import that you know will conflict:
import java.awt.{List => AwtList, _}
In contrast, in Java, you're restricted to global scope for imports, and you can't rename them; you also don't have implicit conversions, so it's okay to only pull in those things that you're looking for. On the other hand, you have powerful IDE support that will help find the class that you're looking for and import just it for you. So for Java, there's a reasonable argument to be made that you should let your IDE pull in just what you need rather than you deciding to grab everything. Personally, I still find this too awkward and just use wildcard imports most of the time.