>
> But I think I see what you mean better now, for example, there is (Locale
> locale, String pattern) and (String pattern). If you intending to pass
> `null` as Locale, why not just use the pattern-only constructor?  I think
> that still could make sense,


OK, but what about `pattern` being null in either?

On Mon, Aug 18, 2025 at 11:30 PM John Hendrikx <john.hendr...@gmail.com>
wrote:

> If certain patterns make no sense, then I think the master constructor
> should reject them (if there is one, or perhaps one should be created as a
> private one).
>
> For example, if there is a width/height constructor, but I only specify
> width and not height, then I think its fine to reject (null, height) and
> (width, null) while accepting (null, null) and (width, height).
>
> But I think I see what you mean better now, for example, there is (Locale
> locale, String pattern) and (String pattern). If you intending to pass
> `null` as Locale, why not just use the pattern-only constructor?  I think
> that still could make sense, especially locale is say coming from a
> configuration file or some such.  If the constructor `null` here, then it
> makes it easier to use it programmatically (ie. if my configuration has a
> Locale then I pass that, if it is null, I pass that -- compare that to
> having to check for Locale being null and then having to select the correct
> constructor...
>
> --John
>
> On 18/08/2025 21:00, Nir Lisker wrote:
>
> Aren't these constructors chained?
>
>
> Not all of them. There are 3 tangential creation paths for
> DateTimeStringConverter and subclasses:
> 1. Through dateStyle/timeStyle ints with an optional locale that creates
> the DateFormat with `DateFormat.getDateTimeInstance(dateStyle, timeStyle,
> locale)` (similar for subclasses). There are 4 constructors here for the
> combinations of: none, only style(s), only locale, all.
> 2. Through a String pattern with an optional locale that creates the
> DateFormat with `new SimpleDateFormat(pattern, locale)`. If pattern is
> null, it uses path 1 above with default styles and the optional locale. If
> you wanted to use a pattern to create this converter, passing null makes
> little sense. It could be surprising to get a "defaults" converter when you
> intended to customize the format with your own pattern to begin with. I
> imagine that if you couldn't get a pattern, you'd use your own int styles
> as a replacement.
> 3. Through a DateFormat that is used directly. If it's null, it checks if
> the pattern is null (which it will always be), in which case it uses the
> defaults of path 1 again (with the default locale since it's not optional
> here). I find it odd here too to pass null and rely on the
> "defaults" converter.
>
> NumberStringConverter and its subclasses are similar. They have path 2
> with 4 combinations: none, only pattern, and locale, and both. And they
> also have path 3 that falls on the default if null.
>
> On Mon, Aug 18, 2025 at 9:06 PM John Hendrikx <john.hendr...@gmail.com>
> wrote:
>
>> Aren't these constructors chained?  I believe it is quite common practice
>> to use nulls when calling a chained constructor to get a default for that
>> parameter.  If a certain type of convenience constructor is missing, a
>> caller can pass in `null` for the parameter they'd like defaulted.  It's
>> not too far-fetched to allow this **if** there is a constructor where this
>> parameter is omitted and is assigned a default.
>>
>> If anything, the constructors IMHO should document that for certain
>> parameters passing in `null` results in a specific default.
>>
>> --John
>> On 18/08/2025 19:46, Nir Lisker wrote:
>>
>> Hi all,
>>
>> In DateTimeStringConverter, NumberStringConverter, and their subclasses,
>> null parameters sent to the constructors are internally converted to
>> default values. This is not specified, but it's how the implementation
>> behaves. I'm working on some changes there and was thinking about changing
>> the behavior to throw NPEs as it makes no sense to pass null into these and
>> it's probably a bug more than anything.
>>
>> The LocalDate/Time converters specified the null-friendly behavior in
>> their docs even though it doesn't make much sense there either.
>>
>> Are we allowed to change this?
>>
>> - Nir
>>
>>

Reply via email to