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

Jonathan Gibbons jonathan.gibbons at oracle.com
Thu Jul 30 03:16:56 UTC 2020

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.

-- Jon

More information about the compiler-dev mailing list