`src/main/java/dev/nipafx/lab/loom/disk` for example seems like alot of directory for just getting some source files organized.
`src/main/java/dev/nipafx/lab/loom/disk` for example seems like alot of directory for just getting some source files organized.
First you have `src/main/java` (compare `src/test/kotlin`), and then the package is encoded as nested directories, and Java has a convention of using the domain name as the root of your packages. So, if your company domain is "sun.com", all your packages start with "com.sun", and then you have more specifiers under that.
But all IDEs and github condense empty directories together, so it's not that bothersome.
Yes in most tools that's quite transparent. Every once in a while I use the GitHub mobile app (which is not doing that), I'm reminded how bothersome it is.
I don't know why, but this bothers me for some reason. To the point that I (perhaps irrationally, I admit) couldn't get "into" learning the language.
Same deal with $GOPATH in Go, until vendoring became properly supported I just hated it.
When you compile a file, the compiler quickly finds all other file dependencies and compiles (or just parses) only them, i.e. given a single file, the compiler knows exactly where to find all the declarations of all the types used in it. This property may not matter for languages that don't have good separate compilation anyway -- and few languages do, which is why people coming from other languages may find the restriction weird -- but Java's separate compilation is excellent. That turns out to also greatly help in-memory compilation for an upcoming feature where we can choose to compile files lazily, on demand: https://openjdk.org/jeps/8304400
To see that that is, indeed, the reason for the restriction, notice that it is only required for public(ish) top-level types. Non top-level public types can also be easily located, and non-public top-level types that are stored in files that don't match their names can only be referenced by code in that file (more precisely, the compiler is allowed to emit an error if they're referenced elsewhere). See the bottom of §7.6 of the JLS: https://docs.oracle.com/javase/specs/jls/se20/html/jls-7.htm....
Anyway, the point is that the restriction is there for a good reason. We sometimes entertain removing that restriction (and maybe someday we will), but the compilation benefits have so far turned up to be quite useful. We like our efficient separate compilation -- I don't think any other mainstream language does it as well as Java -- and may be able to get even more out of it.
[1]: Really, any top-level class that is referenced by name from other files.
not for the compiler, but for the poor souls than will not need to hunt where the hell that structure is defined
As such, code browsers always made this quite easy.
The fact that Eclipse provides a Smalltalk like code browser isn't an accident, rather its Visual Age roots.
It is only a problem when one makes the point to navigate through the source, outside Java tooling.
And using the JAVA ecosystem standard makes it easier for fellow/future developers to continue the support and expansion
There's room for a reasonable alternative that chops the directory structures into more reasonable nesting, for instance.
OH PLEASE NO.
You generally don't write Java using bash/cd/vim; the IDE presents classes and package paths and puts files where they need to be. "Where is my code" is not something you need to explicitly think about.
In contrast, javascript/typescript files are often poorly organized and it's frequently necessary to look for code via grep-like tools. Yes sure, someone could organize js/ts files well, but it actually takes mental effort and coordination among the whole team.
Java was heavily inspired by smalltalk, which IIRC didn't give you a "filesystem" view of your project - it was an integrated environment with a proprietary storage format. Also IIRC early versions of IBM's VisualAge for Java maintained this paradigm. I think the "everything is individual files, but the IDE maintains them" was actually a pretty good compromise.
but yes namespaces must match directory structure.