65 lines
1.5 KiB
Plaintext
65 lines
1.5 KiB
Plaintext
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
|
|
|
|
[source,java]
|
|
----
|
|
interface Status { // Noncompliant
|
|
int OPEN = 1;
|
|
int CLOSED = 2;
|
|
}
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
[source,java]
|
|
----
|
|
public enum Status { // Compliant
|
|
OPEN,
|
|
CLOSED;
|
|
}
|
|
----
|
|
|
|
or
|
|
|
|
[source,java]
|
|
----
|
|
public final class Status { // Compliant
|
|
public static final int OPEN = 1;
|
|
public static final int CLOSED = 2;
|
|
}
|
|
----
|
|
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::comments-and-links.adoc[]
|
|
endif::env-github,rspecator-view[]
|