<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div class="">
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> // Hello.java</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> public class Hello {</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> // tons of logic</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> }</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""><br class="">
</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> void main() {</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> }</span></font></div>
<div class=""><br class="">
</div>
<div class="">and </div>
<div class=""><br class="">
</div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> void main() {</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> }</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""><br class="">
</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> // Hello.java</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> public class Hello {</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> // tons of logic</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> }</span></font></div>
<div class=""><br class="">
</div>
<div class="">Are equivalent, as though the file content is wrapped in an outer class.</div>
<div class=""><br class="">
</div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class="">public class {$name} {}</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> // Hello.java</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> public class Hello {</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> // tons of logic</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> }</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""><br class="">
</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> void main() {</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class=""> }</span></font></div>
<div class=""><font face="Consolas" class=""><span style="font-style: normal;" class="">}</span></font></div>
<div class=""><br class="">
</div>
<div class="">The trigger for an unnamed class is a method or field defined at the top level. So the order doesn’t matter.</div>
<div class=""><br class="">
</div>
<div class="">{$name} is derived from the source file name and must be a valid identifier.</div>
<div class=""><br class="">
</div>
<div class="">When running the source launcher, the class name doesn't matter (we could allow only with the source launcher).</div>
<div class="">When compiling with javac we have to stuff the class somewhere and using a name derived from the source makes sense.</div>
<div class="">So if the source is Hello.java you can access the class Hello.Hello from an external reference.</div>
<div class=""><br class="">
</div>
<div class="">Cheers,</div>
<div class=""><br class="">
</div>
<div class="">— Jim</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<br class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On Sep 29, 2022, at 4:07 AM, Tagir Valeev <<a href="mailto:amaembo@gmail.com" class="">amaembo@gmail.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="">Hello!<br class="">
<br class="">
Very interesting writing, thanks! A couple of notes from me:<br class="">
<br class="">
<blockquote type="cite" class="">## Unnamed classes<br class="">
...<br class="">
Such source files can still have fields, methods, and even nested classes, so<br class="">
that as a program evolves from a few statements to needing some ancillary state<br class="">
or helper methods, these can be factored out of the `main` method while still<br class="">
</blockquote>
<br class="">
I wonder how we tell apart unnamed class syntax and normal class<br class="">
syntax. E.g., consider the source file:<br class="">
<br class="">
// Hello.java<br class="">
public class Hello {<br class="">
// tons of logic<br class="">
}<br class="">
<br class="">
void main() {<br class="">
}<br class="">
<br class="">
Will it be considered as a correct Java file, having Hello class as a<br class="">
nested class of top-level unnamed class?<br class="">
If yes, then, adding a main method after the class declaration, I<br class="">
change the class semantics, making it an inner class.<br class="">
This looks like action at a distance and may cause confusion. E.g., I<br class="">
just wrote a main() method outside of Hello class instead of inside,<br class="">
and boom,<br class="">
now Hello is not resolvable from other classes, for no apparent reason.<br class="">
<br class="">
I assume that the main() method is required for an unnamed class, and<br class="">
if there are only other top-level declarations,<br class="">
then it should be a compilation error, right?<br class="">
<br class="">
<blockquote type="cite" class="">## Predefined static imports<br class="">
```<br class="">
void main() {<br class="">
println("Hello World");<br class="">
}<br class="">
```<br class="">
</blockquote>
<br class="">
I wonder how it will play with existing static star imports. We<br class="">
already saw problems when updated to Java 9 or Java 14 that<br class="">
star-imported class named Module or Record becomes unresolvable. If<br class="">
existing code already imports static method named println from<br class="">
somewhere, will this code become invalid?<br class="">
<br class="">
With best regards,<br class="">
Tagir Valeev.<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</body>
</html>