PROPOSAL: Return 'this'

Neal Gafter neal at gafter.com
Wed Mar 25 16:04:01 PDT 2009


I would expect these methods to be erased to void-returning methods,
and the duplication of the receiver to occur on the caller's side in
the generated code.  So there's no need for any kind of special
auto-covariant type or anything.  You'd need extra a rule that a
method declared to return this can only be overridden by (and can only
override) a method similarly declared to return this.  You need to say
how such methods are recorded in class files (an additional classfile
Attribute on the method?).  How are they treated by reflection?  How
do they appear in the javadoc API?  How should they appear in javadoc?
 How do they appear in the program model API for annotation
processing?

On Wed, Mar 25, 2009 at 2:59 PM, Marek Kozieł <develop4lasu at gmail.com> wrote:
> AUTHOR: Lasu aka Marek Kozieł
>
>
>
>
> OVERVIEW
>
> FEATURE SUMMARY:
> It allows the method to return reference to 'this' object.
>
> MAJOR ADVANTAGE:
> Simplification of "return this" statement.
> 'void' can be easy replaced with 'this'.
>
> MAJOR BENEFIT(s): It would prevent NullPointerException, and make some
> 'builder' like interfaces look really clear and simple.
>
> MAJOR DISADVANTAGE:
> Returned value cannot be changed while inheritance, also other objects
> cannot be returned.
>
> ALTERNATIVES:
> Self-bounded generics, This type, change returned type for every
> method on each inheritance.
>
>
>
>
>
> EXAMPLES
>
> SIMPLE/ADVANCED EXAMPLE:
> public class Builder {
>
>  String text = "";
>
>  public this add (char c){text+=c;}
>
>  public this add (String c){
>    if (c==null){
>      text +="null";
>      return; // this will be returned
>    }
>    text+=c;
>  }
>
>  public static void test(Builder builder) {
>    builder.add('.').add("test()").add(':');
>  }
>
> }
>
> package test;
>
> public class ReturnThis {
>
>  static class A { public this test() { } }
>
>  static class B extends A { }
>
>  static Class<?> getReturnedType(Class<?> classs) {
>    try {
>      return classs.getMethod("test").getReturnType();
>    } catch (SecurityException e) {
>      e.printStackTrace();
>    } catch (NoSuchMethodException e) {
>      e.printStackTrace();
>    }
>    return null;
>  }
>
>  public static void main(String[] args) {
>    System.out.println(getReturnedType(A.class));
>    // will print: class returnThis.ReturnThis$A
>
>    System.out.println(getReturnedType((new A()).getClass()));
>    // will print: class returnThis.ReturnThis$A
>
>    System.out.println(getReturnedType(B.class));
>    // will print: class returnThis.ReturnThis$B
>
>    System.out.println(getReturnedType((new B()).getClass()));
>    // will print: class returnThis.ReturnThis$B
>  }
> }
>
>
>
>
> DETAILS
>
> SPECIFICATION:
> JLS 8.4 (modifications)
>
> ResultType:
>  Type
>  void
>  this*
>
> A method declaration either specifies the type of value that the
> method returns, uses the keyword void to indicate that the method does
> not return a value, or uses the keyword this to indicate that the
> method return the reference to 'this' object.
>
> *Keyword this for return cannot occurs if method is static.
>
>
> JLS 14.17 (modifications)
>
> ReturnStatement:
>  return Expressionopt ;
>
> A return statement with no Expression must be contained in the body of
> a method that is declared, using the keyword void, not to return any
> value (§8.4), or in the body of a method that is declared, using the
> keyword this , to return this reference (§8...),or in the body of a
> constructor (§8.8).
>
> COMPILATION:
> Method just before exiting from it's scope returns 'this'.
> Exceptions work same as before.
> Returned object type is actual object type.
>
> TESTING:
> Normal way.
>
> LIBRARY SUPPORT:
> No.
>
> REFLECTIVE APIS:
> No.
>
> OTHER CHANGES:
> None.
>
> MIGRATION:
> None.
>
> COMPATIBILITY
> Backward: full.
> Forward: Only jars.
>
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6479372
>
> http://java.net/cs/user/view/cs_msg/37432
>
> http://lasu2string.blogspot.com/2009/03/return-this-proposal.html
>
> PS.
> Maybe this Joe consider as 'proposal'.
> Any questions?
>
>
>
> --
> Pozdrowionka. / Regards.
> Lasu aka Marek Kozieł
>
> http://lasu2string.blogspot.com/
>
>



More information about the coin-dev mailing list