Several excellent comments and communications asked me questions about my post on domain objects. There are several points I want to discuss further.
- Why implement
boolean equals(Object), and why compare only primary keys?
- This is a the heart of equality v identity or object equality v instance equality. The basic complaint is why not just rely on identity as implemented in
boolean Object.equals(Object)? Why not, indeed. Do not forget that even if you override equals, you can just call
==yourself which cannot be overriden (in Java) and which always provides identity, not equality. But for domain behavior you really do want things to compare equal which behave identically. In fact, without this property all sorts of code becomes very tedious. Just try to implement an object cache without overriding equals.
- Why mark primary keys as
- This follows from using equality instead of identity for equals. If a primary key changes, the object is no longer the same. The primary keys are therefore immutable. If you want a new domain object, you must create a new instance with different primary keys.
I want a domain-specific language (DSL) in Java for domain objects. Were I writing in a more modern, flexible language such as Scheme (just an example; there are others), I would simply design a DSL for the problem of domain objects. As it is, Java forces an amalgam of coding conventions and extra-linguistic baggage such as XDoclet (equivalently, JDK 5 annotations with code generation) or AOP to accomplish the same task. I want to consider here the Java-only techniques for this goal.