Win a copy of Mesos in Action this week in the Cloud/Virtualizaton forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

why not use interfaces for constants?

 
Piyush Daiya
Ranch Hand
Posts: 67
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi,

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

Piyush
 
Tom Hughes
Ranch Hand
Posts: 86
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Posts: 67
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Posts: 13459
Android Eclipse IDE Ubuntu
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Posts: 8521
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic