Josh Bloch says this (see his must-read book Effective Java for more details) : "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 con-stants, 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." he then goes on to suggest using a non-instantiable class instead. e.g :
I totally agree, on top the reasons above this way is much neater and makes more sense; how many times does the is-a (or behaves-as-a) test hold up when constant interfaces are used ? I've never seen it. T. [ November 13, 2002: Message edited by: Tom Hughes ]
Joined: Jun 13, 2002
Could you share more details on this line --->if in a future release the class is modified so that it no longer needs to use the con-stants, it still must implement the interface to ensure binary compatibility.
I'll just quickly add that it can also create a maintence nightmare. Imagine a heirarchy of classes. Your current class has access to a constant. If there are no interfaces involved, you will be able to find the constant definition in one of the super classes. If (for arguments sake) each superclass implemented a different interface, you'd have to look twice as far. If any classes implement multiple interfaces it get harder again. If, as is in the app I have to support, each of the super classes implement multiple interfaces and each interface is defined as a part of its own heirarchy, it can take you all day to track it down. Yes you can use a text search, but given that the constants aren't related to the interface heirarchy, they are included just for convenience while programming, why bother?