package hierarchy?

Alex Buckley alex.buckley at oracle.com
Mon Jul 17 19:23:32 UTC 2017


The quote from 6.5.3.2 is incorrect -- the paragraph beginning "If Q 
does not name ..." is deleted. We discussed this in May, where I 
explained why the section is the way it is. See 
http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-May/012779.html.

I have also explained that the meaning of the qualified package name 
Q.Id is NOT specified in terms of the simple package name Q. See 
http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-May/012488.html. 
That's why there is no requirement in 6.5.3.2 that Q be uniquely 
visible, only Q.Id.

Stepping back, you seem to have a concern that the spec no longer relies 
on hierarchy to give meaning to packages yet continues to present 
subpackages as a feature of the language; and you believe this is a 
tension that will have deleterious effects on ordinary developers. I do 
not believe it will, because ordinary developers have always understood 
that a package-access type in package p1.p2 is NOT accessible from the 
"related, but not really" package p1.p2.p3. In the modular world, I do 
not believe that a developer who exports p1.p2 has any expectation that 
p1.p2.p3 is exported too. We deliberately designed the syntax of exports 
-- one package per 'exports', no wildcards, no duplicates -- to ensure 
explicit, methodical enumeration of the packages which represent the 
module's contract with the outside world.

Alex

On 7/17/2017 3:59 AM, Stephan Herrmann wrote:
> This continues a discussion we had in January, but still isn't
> fully resolved in JLS 2017-06-26:
>
> Does the parent-sub relation of packages bear any meaning
> from the JLS p.o.v.?
>
> On 2017-01-10 Alex conceded:
>    "... you can consider all packages as unrelated to each other."
>
> Still JLS 6.5.3.2 has this (my emphasis):
>
> "If a package name is of the form Q.Id, then Q must also be a package name.
>   The package name Q.Id names a package that is the member named Id
>   *within the package named by Q*.
>   If Q does not name an observable package (§7.4.3), or Id is not the
> simple name
>   of an observable subpackage of that package, then a compile-time error
> occurs.
>
>   If Q.Id does not name a package that is uniquely visible to the current
>   module (§7.4.3), then a compile-time error occurs."
>
> Now, what's the meaning of "the package named by Q"?
>
> Technically, we need to consider Q as a package name, whose meaning
> is determined by 6.5.3.1 or 6.5.3.2.
> This inevitably implies that Q must be uniquely visible.
>
> In the end, this requires, e.g., that package "java" be uniquely visible in
> every Java 9 program. Or: every Java 9 program (even JDK itself) is
> illegal.
>
>
>
> I *imagine*, the spec authors intended two different definitions of
> PackageName: an internal definition that is applied whenever JLS
> itself refers to a package name, and an external, applicable to
> type or package references in the source code.
> I imagine, only the external definition has to apply the second
> paragraph requiring unique visibility, whereas internal references
> to PackageName should be unaffected by this addition.
>
> *Perhaps*, the phrase "If Q does not name an observable package"
> intends to override the normal interpretation of package names, to
> require only observability, not unique visibility, but this doesn't
> work if first name resolution is obliged to check unique visibility
> and possibly fail compilation.
>
> Now correcting JLS in its current form will be quite tedious, like:
> "within a package that is identified by the name Q, by applying
> 6.5.3 recursively while ignoring any requirement of unique visibility".
> Yikes.
>
> am I missing anything?
> Stephan
>
> Ceterum censeo ...
> I'm really looking forward to the day, when JLS is refactored to
> specify the language with no parent-sub package relation whatsoever,
> leaving it entirely to any host system, to use prefixes of package
> names for grouping stuff in containers like folders of a file system.
> Wouldn't that make for a much cleaner specification?
>
> OTOH, wherever JLS and compiler messages surface the concept of
> a package "hierarchy", it will influence user expectations: Having
> learned about package hierarchies users may likely expect that
> exporting package "p1.p2" will also make "p1.p2.p3" accessible
> just like "p1.p2.MyClass".


More information about the jigsaw-dev mailing list