Proposal: Concise declaration of JavaBeans properties

Joe Darcy Joe.Darcy at Sun.COM
Thu Jun 25 10:40:02 PDT 2009


Yes, this proposal is long overdue and will not be considered for JDK 7.

-Joe

Reinier Zwitserloot wrote:
> You're 2.5 months too late with a proposal. Also, I recall similar  
> proposals having been suggested during the official proposal period  
> (which was the month of march). They did not make the shortlist, for  
> some reason.
> 
>   --Reinier Zwitserloot
> 
> 
> 
> On 2009/25/06, at 12:36, Jan Kroken wrote:
> 
>>    PROJECT COIN SMALL LANGUAGE CHANGE PROPOSAL FORM v1.0
>>
>>    AUTHOR(S): Jan Kroken
>>
>>    OVERVIEW
>>
>>    Add syntactic sugar to reduce the amount of boilerplate code needed
>>    to adhere to the JavaBeans specification.
>>
>>    FEATURE SUMMARY: Should be suitable as a summary in a language  
>> tutorial.
>>
>>    Add a new field modifier, that will generate the neccessary  
>> JavaBeans
>>    methods at compile time.
>>
>>    MAJOR ADVANTAGE:
>>
>>    Significantly reduce the amount of boilerplate code in Java  
>> source code.
>>
>>    MAJOR BENEFIT:
>>
>>    Reducing the amount of boilerplate code will:
>>    - increase readability
>>    - reduce the amount of possible programming errors
>>    - reduce implementation and maintenance cost
>>
>>    MAJOR DISADVANTAGE:
>>
>>    The proposal will increase the complexity of the language.  
>> Methods will
>>    exist without having an explicit declaration, which may confuse
>> programmers
>>    not familiar with the feature.
>>
>>    ALTERNATIVES:
>>
>>    The same feature can possibly be implemented using annotations and
>>    runtime code generation.
>>
>>    EXAMPLES
>>
>>    SIMPLE EXAMPLE:
>>
>>    A value class in the current java language:
>>
>>    public class MyValueObject {
>>      private Type1 field1;
>>      private Type2 field2;
>>
>>      public void setField1(Type1 field1) {
>>          this.field1 = field1;
>>      }
>>
>>      public Type1 getField1() {
>>          return field1;
>>      }
>>
>>      public Type2 getField2() {
>>          return field2;
>>      }
>>    }
>>
>>    The same value with the proposed language modification
>>
>>    public class MyValueObject {
>>      private :exposed(rw) Type1 field1;
>>      private :exposed(r) Type2 field2;
>>    }
>>
>>    Note that :exposed is not the suggested syntax modification.
>>    The exact notation should be decided upon by the working group.
>>
>>    In the above example, :exposed(rw) will expose the value both
>>    through a getter and setter, while :exposed(r) will expose the
>>    value only through a getter.
>>
>>    ADVANCED EXAMPLE:
>>
>>    Any explicit declarations of a JavaBeans method in the current  
>> class
>>    will ensure that the method is not generated based on the field
>>    declaration.
>>
>>    For instance, the class
>>
>>    public class MyValueObject {
>>      private :exposed(rw) Type1 field1;
>>      private :exposed(r) Type2 field2;
>>
>>      public void setField1(Type1 field1) {
>>          if(field1 == null) {
>>              throw new NullPointerException();
>>          }
>>          this.field1 = field1;
>>      }
>>    }
>>
>>    will be equivalent to
>>
>>    public class MyValueObject {
>>      private Type1 field1;
>>      private Type2 field2;
>>
>>      public void setField1(Type1 field1) {
>>          if(field1 == null) {
>>              throw new NullPointerException();
>>          }
>>          this.field1 = field1;
>>      }
>>
>>      public Type1 getField1() {
>>          return field1;
>>      }
>>
>>      public Type2 getField2() {
>>          return field2;
>>      }
>>    }
>>
>>    DETAILS
>>
>>    SPECIFICATION:
>>
>>    A modifier, currently represented by :exposed(specification),
>>    should be added to class fields.
>>
>>    The modifier has two optional arguments, r (read) and w (write).
>>    a read argument specifies that the compiler should generate
>>    public JavaBeans read methods for the field. The write argument
>>    specifies that the compiler should generate a public JavaBeans
>>    set method for the field.
>>
>>    If the field is a boolean field, both a getField and a isField
>>    method will be generated. If one of those are declared in the
>>    current class, none will be generated. This is to avoid a loophole
>>    where a transformation is added to one of those, while the field
>>    is accidentally made available through the other.
>>
>>    if no arguments are provided, both read and write methods will
>>    be generated.
>>
>>    Any explicit declarations of a JavaBeans method in the current  
>> class
>>    will ensure that the method is not generated based on the field
>>    declaration.
>>
>>    If a field is declared as an exposed, and there is a conflict with
>>    JavaBeans methods implemented in a superclass, the JavaBeans  
>> methods
>>    will be generated, and override the ones declared in the  
>> superclass.
>>
>>    The added field modifier should be chosen so it does not conflict
>>    with any existing Java source code.
>>
>>    The change would be implemented as desugaring at compile time. The
>>    class file format or type system will not be affected.
>>
>>    The effect this change will have on stack trace information and
>>    debugging information has not been analyzed.
>>
>>
>>    TESTING:
>>
>>    It will be possible to create test code with a full coverage of all
>>    variants.
>>
>>    LIBRARY SUPPORT:
>>
>>    There is no need for library support.
>>
>>    REFLECTIVE APIS:
>>
>>    This change will not require changes to the reflection apis.
>>
>>    OTHER CHANGES:
>>
>>    The only component that needs to be modified is the compiler.
>>
>>    MIGRATION: Sketch how a code base could be converted, manually or
>> automatically, to use the new feature.
>>
>>    A class could be modified through a series of transformations:
>>
>>    if there is a setter that matches the JavaBeans specification for a
>>    field, and the setter does not contain any other operations than
>> assigning
>>    the field to the passed arguemnt, then the setter can be removed,  
>> and
>>    the modifier :exposed(w) be added to the field declaration.
>>
>>    if there is a getter that matches the JavaBeans specification, the
>> getter
>>    only returns the field value without performing any other  
>> operations,
>> and
>>    there is not another getter not complying with these criteria, the
>>    getter(s) can be removed, and the modifier :exposed(r) be added  
>> to the
>>    field declaration.
>>
>>    redundant occurences of :exposed(r) or :exposed(w) in one field
>>    declaration should be removed.
>>
>>    If a field declaration has both an :exposed(r) and an :exposed(w)
>>    modifier, both should be removed and replaced with a modifier
>>    :exposed.
>>
>>
>>    COMPATIBILITY
>>
>>    BREAKING CHANGES:
>>
>>    No existing java programs will break. However, parsers, compilers  
>> and
>>    source analyzing applications for the java language will break,  
>> and have
>>    to be modified.
>>
>>    EXISTING PROGRAMS:
>>
>>    There will be no changes in behaviour for existing programs,  
>> neither
>>    class files nor programs compiled from source.
>>
>>    REFERENCES
>>
>>    EXISTING BUGS:
>>
>>    URL FOR PROTOTYPE (optional):
>>
>>    No prototype at this time.
>>
> 
> 




More information about the coin-dev mailing list