JDK 16 RFR of JDK-8071961: Add javac lint warning when a default constructor is created

Joe Darcy joe.darcy at oracle.com
Thu Jul 30 04:32:54 UTC 2020


On 7/29/2020 8:16 PM, Jonathan Gibbons wrote:
>
> On 7/29/20 6:45 PM, Joe Darcy wrote:
>> Hello,
>>
>> On 7/29/2020 5:15 PM, Alex Buckley wrote:
>>> On 7/29/2020 1:10 PM, Joe Darcy wrote:
>>>> Please review the code changes and CSR for
>>>>
>>>>      JDK-8071961: Add javac lint warning when a default constructor 
>>>> is created
>>>>      webrev: http://cr.openjdk.java.net/~darcy/8071961.5/
>>>>      CSR: https://bugs.openjdk.java.net/browse/JDK-8250795
>>>
>>> I like the idea of warning about irregular aspects of exported 
>>> classes, such as having an implicitly declared ("default") ctor, or 
>>> implementing an unexported interface. These constructs are not 
>>> always wrong, but they affect how code in other modules can couple 
>>> to code in this module, so system architects may appreciate lint 
>>> warnings in this area.
>>>
>>>> The text of the warning message implies what criteria are being used:
>>>>
>>>>   # 0: symbol, 1: symbol, 2: symbol
>>>>   compiler.warn.default-ctor=\
>>>>       class {0} in exported package {1} of module {2} relies on a 
>>>> default (implicit) constructor
>>>
>>> Recommend "exposes" rather than "relies on". We're in the domain of 
>>> modules, where "relies on" / "depends on" will be taken in 
>>> connection with `requires`.
>>
>> Okay.
>>
>>>
>>> Also, I recommend dropping "(implicit)". I believe the dominant term 
>>> in use is "default", and I think this is not the place for 
>>> parenthetical expressions that can be misinterpreted.
>>
>>
>> Hmm. How about something like:
>>
>>     Since it does not declare an explicit constructor, class {0} in 
>> exported package {1} of module {2} exposes a default constructor
>>
>> As with a number of terms in the JLS, "default" is used in multiple 
>> contexts with different meanings ("default methods" vs a "default 
>> constructor", etc.). The main point to convey here to the reader of 
>> the message is that the *absence* of something is causing the 
>> warning. The location the warning is reported is the start of the 
>> class declaration.
>>
>> Cheers,
>>
>> -Joe
>>
> Since there can only be one default constructor, it seems strange to 
> use the indefinite article, instead of the definite one.
>

Perhaps a bit better as

     Since it does not declare any explicit constructors, class {0} in 
exported package {1} of module {2} exposes a default constructor

using "a default constructor" since (across different classes), there 
are many default constructors.

-Joe



More information about the compiler-dev mailing list