Constructor annotation

Eva Krejcirova eva.krejcirova at oracle.com
Wed Oct 16 12:07:13 PDT 2013


We already have  RT-32860 (Add constructor annotations) for this. I've 
copied this discussion to the JIRA issue.

Eva

On 16.10.2013 19:27, Stephen F Northover wrote:
> Eva,
>
> Perhaps @NamedArg is shorter and makes the code more readable?
>
> If you don't have a JIRA already, please create one and paste in this 
> discussion.  Interested parties can add themselves to the watchers list.
>
> Steve
>
> On 2013-10-16 1:25 PM, Richard Bair wrote:
>> Looks good to me.
>>
>>> On Oct 16, 2013, at 10:02 AM, Stephen F Northover 
>>> <steve.x.northover at oracle.com> wrote:
>>>
>>> It seems we are settling on @NamedArgument ... anybody disagree 
>>> strongly?
>>>
>>> Steve
>>>
>>>> On 2013-10-16 11:45 AM, Richard Bair wrote:
>>>> Ya that works too.
>>>>
>>>>> On Oct 16, 2013, at 8:41 AM, Eva Krejcirova 
>>>>> <eva.krejcirova at oracle.com> wrote:
>>>>>
>>>>> Good point!
>>>>> In FX sources, we already use the @Default annotation which was 
>>>>> used by annotation processor when generating the builders. Because 
>>>>> of this, it has source retention policy, so it cannot be used by 
>>>>> FXMLLoader. I was thinking about promoting this to runtime 
>>>>> annotation but maybe your solution is better.
>>>>>
>>>>> We should solve this for FX8 otherwise the FXMLLoader will behave 
>>>>> differently from how the generated builders behaved.
>>>>>
>>>>> Eva
>>>>>
>>>>>> On 16.10.2013 17:24, Tom Schindl wrote:
>>>>>> One thing that just came to my mind is that maybe also need a way to
>>>>>> define the default value to be used, with a builder I could e.g. 
>>>>>> define
>>>>>> that the default for fields are different from their real native 
>>>>>> default.
>>>>>>
>>>>>> class MyBuilder {
>>>>>>    private boolean a = true;
>>>>>>    private int x = -1;
>>>>>>    private Insets i = new Insets(10);
>>>>>> }
>>>>>>
>>>>>> If we want to have a full replacement for builders the annotation 
>>>>>> must
>>>>>> have the possibility define this (in future).
>>>>>>
>>>>>> public @interface NamedArgument {
>>>>>>    String value();
>>>>>>    String defaultValue();
>>>>>>    Class<Converter> converterClass();
>>>>>> }
>>>>>>
>>>>>> If no converterClass is given we'd have to do our best to 
>>>>>> auto-convert
>>>>>> the String. I don't want to say that we should implement the default
>>>>>> value definition in FX8 but it would feel more natural with an
>>>>>> annotation per argument.
>>>>>>
>>>>>> Tom
>>>>>>
>>>>>>> On 16.10.13 17:12, Tom Schindl wrote:
>>>>>>> To me the JavaBean solution with one annotation looks error 
>>>>>>> prone, does
>>>>>>> anybody know why they did not use an annotation per field?
>>>>>>>
>>>>>>> Tom
>>>>>>>
>>>>>>>> On 16.10.13 16:58, Stephen F Northover wrote:
>>>>>>>> +1 for base.  Should we not follow closely what Java Beans is 
>>>>>>>> doing for
>>>>>>>> consistency?  I realize that we can't have the reference.
>>>>>>>>
>>>>>>>> Steve
>>>>>>>>
>>>>>>>>> On 2013-10-16 10:53 AM, Kevin Rushforth wrote:
>>>>>>>>> Not to mention Tom's point that it can't be in the fxml module 
>>>>>>>>> without
>>>>>>>>> created unwanted (and circular) module dependencies. Seems 
>>>>>>>>> like it
>>>>>>>>> needs to be in the "base" module then, right?
>>>>>>>>>
>>>>>>>>> -- Kevin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Richard Bair wrote:
>>>>>>>>>> +1 this is my preference. It is useful for things other than 
>>>>>>>>>> FXML,
>>>>>>>>>> and should be considered part of our javafx.beans API.
>>>>>>>>>>
>>>>>>>>>>> On Oct 16, 2013, at 4:20 AM, Tom Schindl
>>>>>>>>>>> <tom.schindl at bestsolution.at> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> On 16.10.13 11:22, Eva Krejcirova wrote:
>>>>>>>>>>>> Hi All,
>>>>>>>>>>>>
>>>>>>>>>>>> when we retired builders, we caused a problem for FXML 
>>>>>>>>>>>> which doesn't
>>>>>>>>>>>> have a way to create classes without default constructors. 
>>>>>>>>>>>> Back
>>>>>>>>>>>> then we
>>>>>>>>>>>> decided to use an annotation for this but never actually 
>>>>>>>>>>>> got to
>>>>>>>>>>>> implement it and we need to fix this for FX8. I am in the 
>>>>>>>>>>>> process of
>>>>>>>>>>>> adding this functionality to FXMLLoader but we need to 
>>>>>>>>>>>> decide how the
>>>>>>>>>>>> annotation will look like and I could use some help with this.
>>>>>>>>>>>>
>>>>>>>>>>>> We cannot use already existing ConstructorProperties for 
>>>>>>>>>>>> this, because
>>>>>>>>>>>> it's java.beans package and we don't want to create to 
>>>>>>>>>>>> dependency on
>>>>>>>>>>>> this package in JavaFX, so we need to introduce a new 
>>>>>>>>>>>> annotation.
>>>>>>>>>>>>
>>>>>>>>>>>> We have two options:
>>>>>>>>>>>>
>>>>>>>>>>>> 1. Annotate the whole constructor:
>>>>>>>>>>>> e.g.
>>>>>>>>>>>>     @ConstructorArguments({"a", "b", "list"})
>>>>>>>>>>>>     public ImmutableClass(int a, int b, Integer... list)
>>>>>>>>>>>>
>>>>>>>>>>>> 2. Annotate the arguments:
>>>>>>>>>>>> e.g.
>>>>>>>>>>>>     public ImmutableClass(@FXMLArgument("a") int a,
>>>>>>>>>>>> @FXMLArgument("b")int b, @FXMLArgument("list")Integer... list)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Which option do you like more and how should the annotation 
>>>>>>>>>>>> be named?
>>>>>>>>>>> Option 2, but does it really have to hold FXML in the 
>>>>>>>>>>> annotation name?
>>>>>>>>>>> Where would you put the annotation? I think it should NOT be 
>>>>>>>>>>> in the
>>>>>>>>>>> FXML-Package-Namespace because the core should NOT depend on 
>>>>>>>>>>> FXML!
>>>>>>>>>>>
>>>>>>>>>>> I'd go with @Argument or simply @NamedArgument (@Named is 
>>>>>>>>>>> already used
>>>>>>>>>>> by javax.inject)
>>>>>>>>>>>
>>>>>>>>>>> Tom
>



More information about the openjfx-dev mailing list