[jsr294-modularity-eg] Changes to the superpackage model
Bryan Atsatt
bryan.atsatt at oracle.com
Thu Apr 3 12:04:26 EDT 2008
Obviously I'm all in favor of this model. Some thoughts:
1. This implies that the 'module' qualifier can be used for *members* as
well. In particular, it would be possible to have:
public class Foo {
public static final String A_PUBLIC_CONSTANT = ...
module static final String A_MODULE_PRIVATE_CONSTANT = ...
public void aPublicMethod() {...}
module void aModulePrivateMethod {...}
}
(IMO, this is a very nice advantage of this model over superpackages.)
2. While I understand that the JLS cannot talk about compiler switches,
I strongly believe that we should find a way to define module membership
at this level such that 'module M;' at the source level is supported but
not required: a compiler switch makes for a vastly easier migration to
modules.
Further, we should consider migration of modules from existing module
systems. It will be quite natural for OSGi, for example, to perform
*runtime* mapping of member classes via bytecode manipulations:
injecting the module name and setting the ACC_MODULE flag. We have the
option of introducing APIs to make such mappings fully supported.
// Bryan
Alex Buckley wrote:
> First, I must correct a major oversight in the mail below. Bryan
> Atsatt's mails in February on the undesirability of separate "294
> modules" and "277 modules" were instrumental in getting the new design
> off the ground, and I thank him for numerous discussions behind the
> scenes on module membership and reflection.
>
> Second, I would like a yay or nay from EG members on the new design.
> Please respond as soon as possible. Feedback from developers has been
> very positive.
>
> Alex
>
> Alex Buckley 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
>>
> _______________________________________________
> 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