(update) Use "default" keyword for default visibility

Adrian Kuhn akuhn at iam.unibe.ch
Tue Mar 3 09:03:42 PST 2009


Updated the default visibility proposal

PROJECT COIN SMALL LANGUAGE CHANGE PROPOSAL FORM v1.0

AUTHOR(S): Adrian Kuhn

OVERVIEW:
Allow the "package" keyword to be used as modifier for default  
visibility.

FEATURE SUMMARY:
Use "package" keyword for default visibility.

MAJOR ADVANTAGE:
This change is a "5 cent coin" at best, there are not many advantages  
beyond improved readability and a more beautiful language definition.  
However, the benefit of improved readability is not to be  
underestimated. The missing keyword for default visibility breaks the   
symmetry of visibility modifiers. The use of package visibility is  
less obvious than other visibility since an explicit modifier is  
missing. This decreases readability of source code. For example,  
omitting any of the three explicit modifiers by mistake (or vice verse  
mistakingly adding any of the tree) may introduce unexpected behavior  
which is hard to spot due to the bad readability.

MAJOR BENEFIT:
Improved readability.

MAJOR DISADVANTAGE:
Two ways to express the same thing (in compatibility mode).

ALTERNATIVES:
- Using /*default*/ comments (as often seen) is not an alternative  
since such comments are not processed by the compiler.
- Using a custom-made @Package annotation is feasible (it is what I  
use now) and can be processed by the compiler using an annotation  
processor.

EXAMPLES

SIMPLE EXAMPLE:
public class Point {
	package int x;
	package int y;
}

ADVANCED EXAMPLE:
package ch.akuhn.util;
package class Foo {
}

DETAILS

SPECIFICATION:
"package" is already a keyword, introducing it as a new visibility  
modifier is thus save. To distinguish package visible top-level  
classes and package declarations, the grammar will need a lookahead of  
two tokens (I dont know if this is a problem).

COMPILATION:
Same as now with implicit default visibility.

TESTING:
Same as now with implicit default visibility.

LIBRARY SUPPORT:
None.

REFLECTIVE APIS:
None.

OTHER CHANGES:
None.

MIGRATION:
See below, strict vs compatibility mode.

COMPATIBILITY:
A compiler switch is offered to set either strict or compatibility  
mode. In strict mode, an error is issued if a member has not  
visibility modifier. In compatibility mode, members without visibility  
modifier as treated as default visibile (which is the current  
semantics of Java).

BREAKING CHANGES:
None.

EXISTING PROGRAMS:
Work fine in compatibility mode.

REFERENCES

EXISTING BUGS: To my best knowledge, none.

URL FOR PROTOTYPE (optional):

On Mar 3, 2009, at 13:01 , Stephen Colebourne wrote:

>> PROJECT COIN SMALL LANGUAGE CHANGE PROPOSAL FORM v1.0
>> AUTHOR(S): Adrian Kuhn
>> OVERVIEW
>> Allow the "default" keyword to be used as modifier for default   
>> visibility. In strict mode, missing use of default is a warning /   
>> error, in compatibility mode both the current (ie no default  
>> keyword)  and the new syntax are accepted.
>> FEATURE SUMMARY: Use "default" keyword for default visibility.
>> MAJOR ADVANTAGE: The missing keyword for default visibility breaks  
>> the  symmetry of visibility modifiers. Since it is the only  
>> implicit  modifier, omitting any of the three explicit modifiers by  
>> mistake may  be the source of unexpected behavior and thus hard to  
>> track down bugs.  (There was an example on a blog post recently,  
>> but I cannot find it  know).
>> MAJOR BENEFIT: Symmetry of visibility modifiers is restored.
>> MAJOR DISADVANTAGE: Two ways to express the same thing (in   
>> compatibility mode).
>> ALTERNATIVES: Using a comment such as /* default */ is not an   
>> alternative since such comments are not processed by the compiler.
>> EXAMPLES
>> public class C {
>> 	default Field f;
>> }
>> SIMPLE EXAMPLE: See above.
>> ADVANCED EXAMPLE: None.
>> DETAILS
>> SPECIFICATION: "default" is already a keyword and introducing it as  
>> a  new visibility modifier is save, it does not lead to ambiguous  
>> grammar.
>> COMPILATION: Same as now for implicit default visibility.
>> TESTING: Same as now for implicit default visibility.
>> LIBRARY SUPPORT: None.
>> REFLECTIVE APIS: None.
>> OTHER CHANGES: None.
>> MIGRATION: Compatibility mode allows both, implicit and explicit   
>> default visibility, to be used at  the same time.
>> COMPATIBILITY
>> BREAKING CHANGES: None.
>> EXISTING PROGRAMS: Work fine in compatibility mode.
>> REFERENCES
>> EXISTING BUGS: To my best knowledge, none.
>> URL FOR PROTOTYPE (optional):




More information about the coin-dev mailing list