From the beginning of the introduction of inner classes in Java, developers knew that it would be a mess… and it has been proven again and again. Here is a recent example. Take the following (academic) piece of code:
public class Anonymous { public void foo() { class B {} new B(); } }
Compile it with your standard Java compiler javac
. On both MacOS and Windows, there are two files generated… BUT, these two files have different names (!), thus throwing on the ground some of the dedicated PADL tests (in particular in project PADL Creator ClassFile Tests)
Anonymous.class
Anonymous$1B.class
Anonymous.class
Anonymous$1$B.class
Did you notice the difference? on MacOS, the file describing the inner class is named Anonymous$1B.class
with only one $ sign; on Windows, its name is Anonymous$1$B.class
with two $ signs. Sigh…