I have an application where I have a class called PlausibilityChecker
. This class has only static methods, like checkZipcodeFormat
or checkMailFormat
. I use them in my GUI classes to check the input before sending it to the lower layer.
Is this good practice? I thought I'd go with only static methods so that I don't have to care about passing an instance to the GUI classes or having an instance field in each gui class that doesn't reference a gui object.
I noticed that the Files
class of Java NIO
has only static methods so I assume this can't be that horribly wrong.
Static methods are fine in most situations where the singleton pattern gives too much flexibility. For example, take a simple utility such as raising a primitive to a power - obviously you never need to have any polymorphism in that.
Classes with only static methods is a common pattern in Java for utility methods. Examples in the standard library include Files, Collections, and Executors. For such utility classes, it's a good idea to make sure that your class cannot be instantiated, to make the intent of the class clear.
Static methods are bad for testability. Since static methods belong to the class and not a particular instance, mocking them becomes difficult and dangerous.
Java allows developers to define static methods, which are also available to every instance of a class.
I would say you're doing it right. Apart of that, some advices for your utility class:
static final
. Also, make sure this field is immutable as well e.g. String
s.final
so other programmers cannot extend it.private
, so no other class could create an instance of your utility class (using reflection or something similar will do, but there's no need to go that protective with the class). Why you may not do this? Well, this is the strange case where you want/need to inject an instance of the utility class e.g. through an interface rather than directly using it along your class. Here's an example of this. This design is really odd but may happen (as shown in the link above), but if you will not run in such case, the best advice is to keep the constructor private
.There are lot of libraries that provide utility classes in order to help us programmers with our work. One of the most known is Apache Common set of libraries. It's open source and you can check the code to see how they design these utility classes in order to create yours. (DISCLAIMER: I do not work or support these libraries, I'm a happy user of them)
Important Note: Avoid using a singleton for your utility class.
In Java 8 you can now change your static utility classes to interfaces with static implementations. This eliminates the need for making the class final and having to provide a private constructor. It's as simple as changing 'class' to 'interface' and removing the final word if you have it (all interfaces are abstract so they cannot be final). Since interface methods are always public you can remove any public scope from them. If you have a private constructor then remove that as well (you can't compile an interface with a constructor since they can't be instantiated). It's less code and looks cleaner. You won't have to refactor any classes that already use it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With