JDK-8103306 : Add constructor annotations
  • Type: Enhancement
  • Component: javafx
  • Sub-Component: scenegraph
  • Affected Version: 8
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2013-09-11
  • Updated: 2015-06-16
  • Resolved: 2013-11-19
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8Fixed
Related Reports
Blocks :  
Blocks :  
Comments
Fixed in changeset 1ed0794d3ed3
19-11-2013

From the discussion on openjfx-dev: Perhaps @NamedArg is shorter and makes the code more readable? 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@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@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@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
16-10-2013