PROPOSAL: Auto-assignment Parameters

Derek Foster vapor1 at teleport.com
Fri Apr 3 00:57:06 PDT 2009



-----Original Message-----
>From: Reinier Zwitserloot <reinier at zwitserloot.com>
>Sent: Mar 31, 2009 9:05 AM
>To: Derek Foster <vapor1 at teleport.com>
>Cc: coin-dev at openjdk.java.net
>Subject: Re: PROPOSAL: Auto-assignment Parameters
>
>Derek, if this proposal will save you a lot of typing, I think you're  
>doing it wrong. Thare are many tools that will auto-generate POJOs for  
>you, including whatever setter you prefer. Most IDEs have this in  
>their 'source' or 'refactor' menu, for example.

It wasn't the typing of creating them in the first place that I had in mind, but what comes after that.

I would explain more on that point, but it seems you have saved me the trouble:

>What annoys me about these tools is that they are one-way operations.  
> From seeing the multiple pages of POJO auto-generated code (incl.  
>hashCode, equals, toString, and constructor, and in some cases, the  
>auto-generated builder as well), I cannot ascertain quickly if this is  
>'just' the usual auto-generated boilerplate, or if there's a fun  
>surprise in there someplace (like some field being excluded for equals/ 
>hashCode purposes, or a missing getter, or some such). This makes  
>POJOs spectacularly unmaintainable compared to the low impact they  
>should be having, in java. It's also somewhat difficult (but certainly  
>not impossible) to change things that were used to auto-generate code,  
>such as changing the type or name of a field later.

You and I are in rabid agreement on that point. I don't like code generation tools that spew forth blocks of code that I then have to maintain. To me, the existence of such tools indicates a deficiency in the language. (If it's easy enough for a tool to generate boilerplate code like that, it should be easy for the language to make that boilerplate code unnecessary by generating it for me as I compile.)

>That's why I want a 'data' modifier for class, which will completely  
>auto-generate everything. If the 'saves me typing' argument holds  
>water, imagine what this will do for you!

We agree on this. I want a data modifier for a class also (or could we just use the 'struct' keyword like C++?). However, the auto-assignment parameters proposal has more general applicability to classes other than data classes as well, so I want those too. I might even use them both together in the same class.

> I also don't want such a  
>feature to spin out of a control into an entirely new programming  
>definition syntax, so we'll just use java itself to fill in the gaps  
>and afford us flexibility: If the auto-gen isn't good enough for you,  
>then don't use it and write it the usual way. You get method-level  
>granularity for this process, but that's where it ends. Simple and yet  
>a great boon for code maintainability.

I agree with this as well. I think it's perfectly reasonable for there to be shorthand syntax for common cases, with the ability to override it when something more complex is needed. If I just want to return three values from a method, I don't want to have to write a full-blown class complete with a constructor, getters, and setters. Just specifying the fields is enough. A data class will probably do fine. But I want to be able to replace that data class later with the real thing if necessary without having to update all of the uses of it in the code.

Derek

>
>
>
>  --Reinier Zwitserloot
>
>
>
>On Mar 28, 2009, at 22:31, Derek Foster wrote:
>
>> Just to add a few kudos and comments:
>>
>> I like the proposal a lot. Even in its current form, this would save  
>> me a lot of typing. Of the proposals so far put forth on Project  
>> Coin, this is the one I would probably end up using the most often.  
>> I use a lot of immutable class objects, and this
>>
>> Some suggestions and things to consider:
>>
>> 1) I think that having to repeat "this." all over the place is  
>> perhaps unnecessary. You could use something shorter, like a leading  
>> dot, or perhaps a leading equals sign:
>>
>> class Foo {
>>   final int bar;
>>   final String baz;
>>   Foo(int .bar, String .baz) {}
>>   void setBar(int .bar) {}
>>   void setBaz(String .baz) {}
>> }
>>
>> 2) I think that allowing the syntax for all method parameters, not  
>> just constructor parameters, would be nice.
>>
>> 3) I think that allowing the syntax for return values from methods  
>> has some potential advantages as well. There are some potential  
>> advantages with
>> Javadoc generation, as I describe below, which would make:
>>
>>    String this.foo getFoo() {}
>>
>> advantageous in some circumstances even if it isn't much shorter than:
>>
>>    String getFoo() { return this.foo; }
>>
>> 4) I think you should consider the impact on Javadoc more carefully.  
>> Particularly in cases where people use a prefix ("_", "m_", etc.) on  
>> their internal fields, which is very common. It looks as though  
>> those prefixes would end up being displayed in Javadoc as  
>> constructor parameter names, which would be less than ideal.
>>
>> Also, autogeneration of Javadoc for the this. parameters, based on  
>> Javadoc for the class members they are initialized from would be  
>> nice. Currently, these often have to be maintained in parallel,  
>> which can be a significant annoyance.
>>
>> I often see people write code equivalent to:
>>
>> class Foo {
>>    /** This is the name of a famous person which can't be null and  
>> blah blah blah. */
>>    String _bar;
>>
>>    /**
>>     * Construct a new instance.
>>     * @param bar This is the name of a famous person which can't be  
>> null and blah blah blah.
>>     */
>>    Foo(String bar) {
>>        _bar = bar;
>>    }
>>
>>    /**
>>     * Sets the value of bar.
>>     * @param bar This is the name of a famous person which can't be  
>> null and blah blah blah.
>>     */
>>    void setBar(String bar) {
>>        _bar = bar;
>>    }
>>
>>    /**
>>     * Gets the value of bar.
>>     * @return This is the name of a famous person which can't be  
>> null and blah blah blah.
>>     */
>>    String getBar() {
>>        return _bar;
>>    }
>>
>> }
>>
>> which essentially reproduces the same JavaDoc comment four times  
>> (and means it must be maintained in quadruplicate if changes are  
>> made). It would be nice to replace this with something like:
>>
>> class Foo {
>>    /** This is the name of a famous person which can't be null and  
>> blah blah blah. */
>>    String _bar;
>>
>>    /** Construct a new instance. */
>>    Foo(String this.bar) {}
>>
>>    /** Sets the value of bar. */
>>    void setBar(String this.bar) {}
>>
>>    /** Gets the value of bar. */
>>    String this.bar getBar() {}
>> }
>>
>> with the same Javadoc being generated as the prior example.
>>
>> 5) Being able to omit the type in all of these cases would be a big  
>> plus. When I have a variable of a type like  
>> "List<Map<ReallyLongTypeName,OtherReallyLongTypeName>>", it would be  
>> awfully nice to be able to omit having to specify that detail  
>> redundantly in the constructor, settter, and getter.
>>
>> Derek
>>
>>
>>
>>
>> -----Original Message-----
>>> From: Mark Mahieu <markmahieu at googlemail.com>
>>> Sent: Mar 26, 2009 2:21 PM
>>> To: Marek Kozieł <develop4lasu at gmail.com>
>>> Cc: coin-dev <coin-dev at openjdk.java.net>
>>> Subject: Re: PROPOSAL: Auto-assignment Parameters
>>>
>>> 2009/3/26 Marek Kozieł <develop4lasu at gmail.com>
>>>
>>>> I see one problem here.
>>>> class Some{
>>>>  final String name;
>>>>  public Some(String this.name){}
>>>> }
>>>>
>>>> perform .intern() is impossible now.
>>>
>>>
>>> Correct, you'd have to write it the same way as you'd do now.  I  
>>> actually
>>> view that as a Good Thing though: there's a clear, visual distinction
>>> between parameters which are just assigned directly to the fields,  
>>> and those
>>> on which we perform some operation first.  Only the latter would  
>>> appear in
>>> the body of the constructor, without being cluttered by the former.
>>>
>>>
>>>> But I like the proposition 'much'.
>>>> Simple and clear.
>>>
>>>
>>> Glad you like it!
>>>
>>>
>>> Regards,
>>>
>>> Mark
>>>
>>
>>
>




More information about the coin-dev mailing list