You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@logging.apache.org by Gary Gregory <ga...@gmail.com> on 2020/11/17 20:25:23 UTC

Fwd: Log4j JSON layout template Uris enum

Hi all,

Why is this an enum and not a class?

Gary

Re: Log4j JSON layout template Uris enum

Posted by Volkan Yazıcı <vo...@gmail.com>.
Replaced all "enum" singletons with "[static] final class"es in both master
and release-2.x.

On Wed, Nov 18, 2020 at 2:04 PM Gary Gregory <ga...@gmail.com> wrote:

> Hi Volkan,
>
> I think the strength of the feelings in my argument was more of a
> reflection on my frustration of my lack of involvement in this new valuable
> module. There are many FOSS projects I care about and only so many hours in
> a day. I am glad that you are open to my views, regardless of the outcome
> we choose.
>
> In general I would say we want 100% binary compatibility for the 2 API
> modules. For other modules we don't want to make life harder than it has to
> be for folks but my personal view is that this case falls into the category
> where we can do whatever we want.
>
> Gary
>
> Gary
>
> On Wed, Nov 18, 2020, 03:15 Volkan Yazıcı <vo...@gmail.com> wrote:
>
> > Thanks for your sincere feedback Gary, really appreciated.
> >
> > Given none of us is really strongly opinionated about this, except Gary,
> I
> > am okay to follow his suggestion. This brings up the following question:
> > Shall I replace all enum singletons (in JTL module) with "final classes
> > with a private ctor"? If so, would it break the binary compatibility? If
> it
> > would, given JTL is a pretty new module and probably doesn't have any
> > wide-spread usage of its classes by users, is it a big deal?
> >
> > BTW, I am really happy this (un?)fortunate occasion triggered another
> > committer to review the JTL code base. Feels like a win for me. ;P
> >
> > On Wed, Nov 18, 2020 at 12:28 AM Gary Gregory <ga...@gmail.com>
> > wrote:
> >
> > > [Please take this constructively despite my string words]
> > >
> > > Arg. As much as I love Effective Java and admire Joshua Bloch, this one
> > > feels like a brain fart, and Block even concedes this pattern "may
> feel a
> > > bit unnatural", no kidding. This is an ENUM, but it does NOT enumerate
> > > ANYTHING. It is only used as a hack to avoid defining a private ctor.
> The
> > > falls for me in the same category as defining constants in interfaces
> > when
> > > interfaces should be used to define contracts.
> > >
> > > To make things worse, this enum does not even follow the pattern
> > documented
> > > in Effective Java because it does not define an INSTANCE enum value!
> > >
> > > For me, this definitely violates the principle of least surprise :-(
> > >
> > > Sorry to pile on... but also: Why is this type even public?
> > >
> > > I suppose I only have myself to blame for not reviewing the original
> > commit
> > > ;-) but I am reviewing now ;-)
> > >
> > > Gary
> > >
> > >
> > >
> > > On Tue, Nov 17, 2020 at 3:59 PM Carter Kozak <ck...@ckozak.net>
> wrote:
> > >
> > > > I'm a big fan fan of enum singletons. This case looks like an enum
> with
> > > no
> > > > values for utility methods to avoid a private ctor, I haven't used
> > enums
> > > > this way myself. I think the trade-off is between avoiding having to
> > > write
> > > > a private constructor to prevent extension, and the downside of enum
> > > static
> > > > methods e.g. Uris.values(), Uris.valueOf(String),
> > > > Uris.valueOf(Class,String) which could be argued violate the
> principle
> > of
> > > > least astonishment. I don't have much of an opinion on enum utility
> > > methods.
> > > >
> > > > On Tue, Nov 17, 2020, at 15:48, Volkan Yazıcı wrote:
> > > > > I use enums for singletons, which is the recommended way to create
> > > > > singletons in Effective Java by Joshua Bloch. Given I have used it
> in
> > > > some
> > > > > other places as well and heard no complaints so far, I did not
> > convert
> > > > them
> > > > > to a final class with a private ctor. Should I?
> > > > >
> > > > > On Tue, Nov 17, 2020 at 9:25 PM Gary Gregory <
> garydgregory@gmail.com
> > >
> > > > wrote:
> > > > >
> > > > > > Hi all,
> > > > > >
> > > > > > Why is this an enum and not a class?
> > > > > >
> > > > > > Gary
> > > > > >
> > > > >
> > > >
> > >
> >
>

Re: Log4j JSON layout template Uris enum

Posted by Gary Gregory <ga...@gmail.com>.
Hi Volkan,

I think the strength of the feelings in my argument was more of a
reflection on my frustration of my lack of involvement in this new valuable
module. There are many FOSS projects I care about and only so many hours in
a day. I am glad that you are open to my views, regardless of the outcome
we choose.

In general I would say we want 100% binary compatibility for the 2 API
modules. For other modules we don't want to make life harder than it has to
be for folks but my personal view is that this case falls into the category
where we can do whatever we want.

Gary

Gary

On Wed, Nov 18, 2020, 03:15 Volkan Yazıcı <vo...@gmail.com> wrote:

> Thanks for your sincere feedback Gary, really appreciated.
>
> Given none of us is really strongly opinionated about this, except Gary, I
> am okay to follow his suggestion. This brings up the following question:
> Shall I replace all enum singletons (in JTL module) with "final classes
> with a private ctor"? If so, would it break the binary compatibility? If it
> would, given JTL is a pretty new module and probably doesn't have any
> wide-spread usage of its classes by users, is it a big deal?
>
> BTW, I am really happy this (un?)fortunate occasion triggered another
> committer to review the JTL code base. Feels like a win for me. ;P
>
> On Wed, Nov 18, 2020 at 12:28 AM Gary Gregory <ga...@gmail.com>
> wrote:
>
> > [Please take this constructively despite my string words]
> >
> > Arg. As much as I love Effective Java and admire Joshua Bloch, this one
> > feels like a brain fart, and Block even concedes this pattern "may feel a
> > bit unnatural", no kidding. This is an ENUM, but it does NOT enumerate
> > ANYTHING. It is only used as a hack to avoid defining a private ctor. The
> > falls for me in the same category as defining constants in interfaces
> when
> > interfaces should be used to define contracts.
> >
> > To make things worse, this enum does not even follow the pattern
> documented
> > in Effective Java because it does not define an INSTANCE enum value!
> >
> > For me, this definitely violates the principle of least surprise :-(
> >
> > Sorry to pile on... but also: Why is this type even public?
> >
> > I suppose I only have myself to blame for not reviewing the original
> commit
> > ;-) but I am reviewing now ;-)
> >
> > Gary
> >
> >
> >
> > On Tue, Nov 17, 2020 at 3:59 PM Carter Kozak <ck...@ckozak.net> wrote:
> >
> > > I'm a big fan fan of enum singletons. This case looks like an enum with
> > no
> > > values for utility methods to avoid a private ctor, I haven't used
> enums
> > > this way myself. I think the trade-off is between avoiding having to
> > write
> > > a private constructor to prevent extension, and the downside of enum
> > static
> > > methods e.g. Uris.values(), Uris.valueOf(String),
> > > Uris.valueOf(Class,String) which could be argued violate the principle
> of
> > > least astonishment. I don't have much of an opinion on enum utility
> > methods.
> > >
> > > On Tue, Nov 17, 2020, at 15:48, Volkan Yazıcı wrote:
> > > > I use enums for singletons, which is the recommended way to create
> > > > singletons in Effective Java by Joshua Bloch. Given I have used it in
> > > some
> > > > other places as well and heard no complaints so far, I did not
> convert
> > > them
> > > > to a final class with a private ctor. Should I?
> > > >
> > > > On Tue, Nov 17, 2020 at 9:25 PM Gary Gregory <garydgregory@gmail.com
> >
> > > wrote:
> > > >
> > > > > Hi all,
> > > > >
> > > > > Why is this an enum and not a class?
> > > > >
> > > > > Gary
> > > > >
> > > >
> > >
> >
>

Re: Log4j JSON layout template Uris enum

Posted by Volkan Yazıcı <vo...@gmail.com>.
Thanks for your sincere feedback Gary, really appreciated.

Given none of us is really strongly opinionated about this, except Gary, I
am okay to follow his suggestion. This brings up the following question:
Shall I replace all enum singletons (in JTL module) with "final classes
with a private ctor"? If so, would it break the binary compatibility? If it
would, given JTL is a pretty new module and probably doesn't have any
wide-spread usage of its classes by users, is it a big deal?

BTW, I am really happy this (un?)fortunate occasion triggered another
committer to review the JTL code base. Feels like a win for me. ;P

On Wed, Nov 18, 2020 at 12:28 AM Gary Gregory <ga...@gmail.com>
wrote:

> [Please take this constructively despite my string words]
>
> Arg. As much as I love Effective Java and admire Joshua Bloch, this one
> feels like a brain fart, and Block even concedes this pattern "may feel a
> bit unnatural", no kidding. This is an ENUM, but it does NOT enumerate
> ANYTHING. It is only used as a hack to avoid defining a private ctor. The
> falls for me in the same category as defining constants in interfaces when
> interfaces should be used to define contracts.
>
> To make things worse, this enum does not even follow the pattern documented
> in Effective Java because it does not define an INSTANCE enum value!
>
> For me, this definitely violates the principle of least surprise :-(
>
> Sorry to pile on... but also: Why is this type even public?
>
> I suppose I only have myself to blame for not reviewing the original commit
> ;-) but I am reviewing now ;-)
>
> Gary
>
>
>
> On Tue, Nov 17, 2020 at 3:59 PM Carter Kozak <ck...@ckozak.net> wrote:
>
> > I'm a big fan fan of enum singletons. This case looks like an enum with
> no
> > values for utility methods to avoid a private ctor, I haven't used enums
> > this way myself. I think the trade-off is between avoiding having to
> write
> > a private constructor to prevent extension, and the downside of enum
> static
> > methods e.g. Uris.values(), Uris.valueOf(String),
> > Uris.valueOf(Class,String) which could be argued violate the principle of
> > least astonishment. I don't have much of an opinion on enum utility
> methods.
> >
> > On Tue, Nov 17, 2020, at 15:48, Volkan Yazıcı wrote:
> > > I use enums for singletons, which is the recommended way to create
> > > singletons in Effective Java by Joshua Bloch. Given I have used it in
> > some
> > > other places as well and heard no complaints so far, I did not convert
> > them
> > > to a final class with a private ctor. Should I?
> > >
> > > On Tue, Nov 17, 2020 at 9:25 PM Gary Gregory <ga...@gmail.com>
> > wrote:
> > >
> > > > Hi all,
> > > >
> > > > Why is this an enum and not a class?
> > > >
> > > > Gary
> > > >
> > >
> >
>

Re: Log4j JSON layout template Uris enum

Posted by Gary Gregory <ga...@gmail.com>.
[Please take this constructively despite my string words]

Arg. As much as I love Effective Java and admire Joshua Bloch, this one
feels like a brain fart, and Block even concedes this pattern "may feel a
bit unnatural", no kidding. This is an ENUM, but it does NOT enumerate
ANYTHING. It is only used as a hack to avoid defining a private ctor. The
falls for me in the same category as defining constants in interfaces when
interfaces should be used to define contracts.

To make things worse, this enum does not even follow the pattern documented
in Effective Java because it does not define an INSTANCE enum value!

For me, this definitely violates the principle of least surprise :-(

Sorry to pile on... but also: Why is this type even public?

I suppose I only have myself to blame for not reviewing the original commit
;-) but I am reviewing now ;-)

Gary



On Tue, Nov 17, 2020 at 3:59 PM Carter Kozak <ck...@ckozak.net> wrote:

> I'm a big fan fan of enum singletons. This case looks like an enum with no
> values for utility methods to avoid a private ctor, I haven't used enums
> this way myself. I think the trade-off is between avoiding having to write
> a private constructor to prevent extension, and the downside of enum static
> methods e.g. Uris.values(), Uris.valueOf(String),
> Uris.valueOf(Class,String) which could be argued violate the principle of
> least astonishment. I don't have much of an opinion on enum utility methods.
>
> On Tue, Nov 17, 2020, at 15:48, Volkan Yazıcı wrote:
> > I use enums for singletons, which is the recommended way to create
> > singletons in Effective Java by Joshua Bloch. Given I have used it in
> some
> > other places as well and heard no complaints so far, I did not convert
> them
> > to a final class with a private ctor. Should I?
> >
> > On Tue, Nov 17, 2020 at 9:25 PM Gary Gregory <ga...@gmail.com>
> wrote:
> >
> > > Hi all,
> > >
> > > Why is this an enum and not a class?
> > >
> > > Gary
> > >
> >
>

Re: Log4j JSON layout template Uris enum

Posted by Carter Kozak <ck...@ckozak.net>.
I'm a big fan fan of enum singletons. This case looks like an enum with no values for utility methods to avoid a private ctor, I haven't used enums this way myself. I think the trade-off is between avoiding having to write a private constructor to prevent extension, and the downside of enum static methods e.g. Uris.values(), Uris.valueOf(String), Uris.valueOf(Class,String) which could be argued violate the principle of least astonishment. I don't have much of an opinion on enum utility methods.

On Tue, Nov 17, 2020, at 15:48, Volkan Yazıcı wrote:
> I use enums for singletons, which is the recommended way to create
> singletons in Effective Java by Joshua Bloch. Given I have used it in some
> other places as well and heard no complaints so far, I did not convert them
> to a final class with a private ctor. Should I?
> 
> On Tue, Nov 17, 2020 at 9:25 PM Gary Gregory <ga...@gmail.com> wrote:
> 
> > Hi all,
> >
> > Why is this an enum and not a class?
> >
> > Gary
> >
> 

Re: Log4j JSON layout template Uris enum

Posted by Volkan Yazıcı <vo...@gmail.com>.
I use enums for singletons, which is the recommended way to create
singletons in Effective Java by Joshua Bloch. Given I have used it in some
other places as well and heard no complaints so far, I did not convert them
to a final class with a private ctor. Should I?

On Tue, Nov 17, 2020 at 9:25 PM Gary Gregory <ga...@gmail.com> wrote:

> Hi all,
>
> Why is this an enum and not a class?
>
> Gary
>