According to Joshua Bloch, author of "Effective Java":
The constant interface pattern is a poor use of interfaces.
That a class uses some constants internally is an implementation detail.
Implementing a constant interface causes this implementation detail to leak into the class’s exported API. It is of no consequence to the users
of a class that the class implements a constant interface. In fact, it may even confuse them. Worse, it represents a commitment: if in a future
release the class is modified so that it no longer needs to use the constants, it still must implement the interface to ensure binary compatibility.
If a nonfinal class implements a constant interface,
all of its subclasses will have their namespaces polluted by the constants in the interface.
This rule raises an issue when an interface consists solely of fields, without any other members.
Noncompliant Code Example
interface Status { // Noncompliant
int OPEN = 1;
int CLOSED = 2;
}
Compliant Solution
public enum Status { // Compliant
OPEN,
CLOSED;
}
or
public final class Status { // Compliant
public static final int OPEN = 1;
public static final int CLOSED = 2;
}