There is a lot of debate on the intertubes if one should or shouldn’t use wildcard imports. I’m mostly indifferent to the discussion (mainly because all the package references are resolved compile time – so there is no performance overhead – and because today’s IDE’s contain a lot of smarts to help you figure out which is the actual class being referenced), but here is something interesting I discovered recently:
Lets say that we have two classes with the same name in different packages:
package foo; public class Foo { public static void print() { System.out.println("Foo"); } }
package bar; public class Foo { public static void print() { System.out.println("Bar"); } }
Now create a test class in the bar package:
package bar; import foo.*; public class Test { public static void main(String[] args) { Foo.print(); } }
Question: what will this class print out? The answer is – surprisingly for me – “Bar”. It seems that the Java compiler (tested with 1.6u18, but this is probably the same with other versions – although I’m not sure about alternative implementations like GCJ) uses the following order to determine the canonical class name:
- Classes which are explicitly imported
- Classes which are in the current package
- Classes imported with wildcards
Just something to know about.
Picture taken from salimfadhley’s photostream with permission.
PS. Amusing sidenote: when you search for import on Flickr, a lot of “babe” photos come up, even with safe search on. Is “import” a codeword for something? 🙂