Proposal: Concise declaration of JavaBeans properties

Reinier Zwitserloot reinier at zwitserloot.com
Thu Jun 25 06:38:02 PDT 2009


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