[jsr294-modularity-eg] Changes to the superpackage model

Michal Cierniak cierniak at google.com
Fri Apr 4 19:50:46 EDT 2008


I like this change.  It makes everything cleaner!

On Wed, Mar 26, 2008 at 2:40 PM, Alex Buckley <Alex.Buckley at sun.com> wrote:
> I propose a change to the nomenclature and design of superpackages.
>
>  JSR 294 has so far aimed to minimize syntactic changes in existing
>  source code, at the cost of redefining the semantics of 'public'
>  according to a separate compilation unit (super-package.java).
>
>  There are some problems with that aim:
>
>  - Redefining an existing access modifier is not respectful of millions
>    of developers' investment in the traditional accessibility model of
>    the Java platform. I say "platform" not "language" because redefining
>    'public' means redefining the ACC_PUBLIC flag in a classfile, and that
>    affects every non-Java language compiler targeting the JVM.
>
>  - Minimizing changes in existing source code is not respectful of the
>    Java language principle that "Reading is more important than than
>    writing". To save one developer from writing 'superpackage S;' in
>    a source file, we impose a burden on every subsequent developer who
>    reads the source file and wants to reason about accessibility.
>
>  - Even if a separate export list is thought desirable (and it surely
>    has a valuable documentary role), it is insufficient to have only
>    simple regexs ('export foo.*'). A discussion thus starts about
>    what regexs the JLS should support, which is frankly a distraction
>    from bigger issues and provides yet more complexity for a developer
>    trying to determine what is accessible.
>
>  My proposal:
>
>  - Retain the current meaning of 'public' and ACC_PUBLIC.
>
>  - Introduce a 'module' access modifier for types and members. A new
>    ACC_MODULE flag (0x8000) reifies module accessibility in a classfile.
>
>  - Require any compilation unit whose types are 'module'-private or
>    access module-private types/members, to identify their module
>    membership via a single 'module M;' declaration.
>
>    (It is not possible to make 'module M;' optional in these
>    circumstances. In theory, a compiler switch can identify a class's
>    module membership, but the JLS cannot talk about compiler switches;
>    yet it must know module membership to determine accessibility.)
>
>    A classfile has a Module attribute to reify module membership.
>
>  - Since globally public types are 'public' and module-private types are
>    'module' qualified, there is no need for super-package.java. Only if
>    module-level annotations are used does the following file, analogous
>    to package-info.java, come into play:
>
>    // This file is M/module-info.java and compiles to M/module-info.class
>    @Foo
>    @Version(...)
>    @Imports(...)
>    module M;
>
>  Implications of the proposal:
>
>  - There are no nested superpackages. The EG has never supported them.
>    I personally continue to support them, and think there is an
>    interesting design space for nesting with decentralized module
>    declarations. But it can be left for another day.
>
>  - super-package.class no longer appears as an authoritative member and
>    export list. This is a non-issue in security terms, since the file was
>    always trivially changeable.
>
>  - module-info.class will be reified to support enumerating its
>    annotations, but the 294 reflection API will not be able to enumerate
>    a module's member and export lists. (Akin to how a package's member
>    types cannot be enumerated.) Stanley Ho and I will work to simplify
>    this API in general and unify it with 277's API.
>
>  - super-package.class no longer needs to be regenerated when a new type
>    is added to a package P and 'export P.*;' is in super-package.java.
>
>  - super-package.class no longer needs to be read by the VM when loading
>    a class. A classfile's accessibility is completely self-described.
>
>  - A JAM file in JSR 277 can be built by examining the classfiles named
>    by the deployer (e.g. as parameters on the 'jam' command line):
>    - The member list is available trivially.
>    - The export list is the set of public types in the member list.
>    - The import list is denoted by @Imports in module-info.java.
>
>  With this proposal, a module in JSR 294 continues to be the foundation
>  of a module in JSR 277, but getting started with just a 294 module is
>  now easier because the 'module' modifier is a simple and consistent
>  extension of the traditional accessibility model (in line with the
>  second goal of the 294 strawman). Comments are welcome.
>
>  Alex
>  _______________________________________________
>  jsr294-modularity-eg mailing list
>  jsr294-modularity-eg at cs.oswego.edu
>  http://cs.oswego.edu/mailman/listinfo/jsr294-modularity-eg
>


More information about the jsr294-modularity-eg mailing list