wood burning stoves 2.0*
The moose likes Java in General and the fly likes why not use interfaces for constants? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of EJB 3 in Action this week in the EJB and other Java EE Technologies forum!
JavaRanch » Java Forums » Java » Java in General
Bookmark "why not use interfaces for constants?" Watch "why not use interfaces for constants?" New topic
Author

why not use interfaces for constants?

Piyush Daiya
Ranch Hand

Joined: Jun 13, 2002
Posts: 67
Hi,

I have been getting conflicting views about why not use interfaces for constants?
Can anyone shed some light on it?

Piyush


"A scientist is not person who gives right answers but a person who asks right questions"
Tom Hughes
Ranch Hand

Joined: Feb 09, 2002
Posts: 86
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 ]
Piyush Daiya
Ranch Hand

Joined: Jun 13, 2002
Posts: 67
Hi Tom,

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.

Piyush
David O'Meara
Rancher

Joined: Mar 06, 2001
Posts: 13459

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?
Cindy Glass
"The Hood"
Sheriff

Joined: Sep 29, 2000
Posts: 8521
This is a good conversation on the same topic:
http://www.coderanch.com/t/368527/java/java/Name-constants
NOW who do I go along with . . . the highly esteemed Joshua Bloch . . . or my personal hero Michael Ernest?
Sorry Michael


"JavaRanch, where the deer and the Certified play" - David O'Meara
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: why not use interfaces for constants?
 
Similar Threads
How do I use a file to hold all my constants
variable in interface
interfaces Vs abstract classes
Question On Interface
why variables inside interface has to final