I am not a big fan of extending Static Utility classes.  And Joshua Bloch is not either from his book "Effective Java"...

See: https://www.informit.com/articles/article.aspx?p=1216151&seqNum=4


On 9/6/2020 10:06 AM, Xeno Amess wrote:
class AUtil {
     public static String getStringA() {
         return "A";
     }
}

class ExtendedAUtil extends AUtil {
     public static String getStringABCDE() {
         return "ABCDE";
     }
}

public class Main {
     public static void main(String[] args) {
         System.out.println(ExtendedAUtil.getStringA());
         System.out.println(ExtendedAUtil.getStringABCDE());
     }
}

Maybe it's better to add some runnable codes :)

Xeno Amess <xenoam...@gmail.com> 于2020年9月6日周日 下午10:05写道:

Well sometimes we want to extend(or modify) some behaviors of one Util
Class.That is why I don't want the constructor be private.
For example, there be a AUtil:

public class AUtil{
     public static String getStringA(){
           return "A";
     }
}

then some people need a function that returns "ABCDE".
Actually "ABCDE" is useless for any other repos, so we can never pass the
pr to put the getABCDE function to AUtil.
And that people also need the  getStringA function.
So there be a way:

public class ExtendedAUtil extends{
     public static String getStringABCDE(){
           return "ABCDE";
     }
}

In this way that people can use ExtendedAUtil as an extended  AUtil.
I admit that might be sugar and tricky, but it will help shorten the codes.
BUT if we make the AUtil have only private constructor, then we cannot do
such things, as class who have private constructors only cannot be extended.

Melloware <melloware...@gmail.com> 于2020年9月6日周日 下午9:55写道:

That is why I love Lombok's @UtilityClass.

https://projectlombok.org/features/experimental/UtilityClass

It enforces a static class is truly static by making the constructor
private and throwing an exception, making sure all methods are static,
marking the class as Final etc.


On 9/6/2020 9:53 AM, Xeno Amess wrote:
   Inheritance in Java on the static side is
not the same as on the instance side

Yep, I know it. It will not override but just, hiding.
I admit it might confuse people sometimes.

subclassing a class that only
provides static methods is no help.

Well actually I personally use it for a shortcut or something.
Of course we can do this by fork/wrap the static functions one by one,
but
extending it directly can make the codes shorter.

Gary Gregory <garydgreg...@gmail.com> 于2020年9月6日周日 下午9:48写道:

On Sun, Sep 6, 2020 at 9:44 AM Xeno Amess <xenoam...@gmail.com> wrote:

The idea behind not making *Util constructors private is that it makes
people be able to extend that class.
for example:


https://github.com/apache/commons-lang/blob/master/src/main/java/org/apache/commons/lang3/StringUtils.java#L9627

I have not see a use case that requires instances of classes that only
provide static methods in a long time, like the Javadoc mentions, there
used to be JavaBean tools that needed this, and some UI builders IIRC,
but
I do not see a case of it today. Inheritance in Java on the static
side is
not the same as on the instance side, so subclassing a class that only
provides static methods is no help.

Gary


Gary Gregory <garydgreg...@gmail.com> 于2020年9月6日周日 下午9:39写道:

The idea behind making *Util constructors private is that it does not
make
sense to instantiate a class that only has static methods.

Gary


On Sun, Sep 6, 2020 at 12:49 AM Xeno Amess <xenoam...@gmail.com>
wrote:
for example: can we make its constructor public instead of private?

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to