Module accessibility (was: Project Jigsaw: The Big Picture (part 1))
jesse.glick at oracle.com
Thu Dec 22 03:03:06 PST 2011
On 12/21/2011 09:29 PM, David M. Lloyd wrote:
> Expand package/default access or protected access (or both) to mean "module-wide"
> instead of "package-wide" if the source/class file version is Java 8 or later
For code targeted to 8+ and not using any (nondefault) views, I like this a lot:
1. "public" would mean what it says - to javac, to javadoc, to java; and most importantly, to someone reading an individual source file.
2. Refactoring implementation code inside a module into (or out of, or across) nested packages for clarity would become simpler because you would not need to fiddle with
modifiers - all the impl code would use default access regardless of package location (keeping the code shorter too), with the obvious exception of overridden public methods.
3. The well-known problem of adding an internal-only method (called from other packages) to an exported class would disappear - just use default access. (In current
Jigsaw I think you have to work around this by adding an unexported type in the exported package which delegates to a default-access method; in systems which only allow
whole packages to be exported, the workaround is more intricate, involving a callback in a nonexported package and static initializers.)
4. The module-info.java semantics could permit you to omit "exports" clauses, or perhaps explicitly says "exports *", to mean that any class in any package should be
accessible iff it is marked public. This avoids the bottleneck of editing module-info.java every time you place a new package into the API (thus risking merge conflicts
in an SCM etc.).
If you are using views to export certain packages to certain callers only, then I guess module-info.java could use explicit "exports" clauses as in the current proposal,
while still taking advantage of #3 and perhaps #2.
> you don't even have to take advantage of the feature at all if you're
> just repackaging old class files because they obviously already work with the more constrained visibility that they originally shipped with.
They would still work, but you may want to ban outside access to implementation packages despite their containing public members. For this case also, an explicit list of
"exports" clauses would work if recompiling with -source 8 or using 'jar uvf *.jar module-info.class'.
More information about the jigsaw-dev