Easy, Simple Java Classes ( like Scala case classes, sort of)
Avoid having to write field declarations, toString(), equals() or hashCode() for your classes
-
Create 2-tuple (pair) class thats generic and overridable:
public class _<ONE, TWO> { protected final ONE $1; protected final TWO $2; public _(final ONE _1, final TWO _2) { this.$1 = _1; this.$2 = _2; } public boolean equals(final Object obj) { return this == obj || obj != null && getClass() == obj.getClass() && $1.equals(((_<?, ?>) obj).$1) && $2.equals(((_<?, ?>) obj).$2); } public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ($1 == null ? 0 : $1.hashCode()); result = prime * result + ($2 == null ? 0 : $2.hashCode()); return result; } public String toString() { return format("[%s,%s]",$1,$2); } }
-
Override with appropriate fields:
public class Product extends _<String, String> { public Product(final String id, final String name) { super(id, name); } public String id() { return $1; } public String name() { return $2; } }
- You can do the same with singles, triples and quadruples for classes with 1, 3 and 4 fields respectively (beyond 4 it's not worth it). I've found that pairs (ie classes with two dependencies) are by far the most frequent.
- Improve: check class of fields to optimise hashing function
Inspired by Andy Parker's Equalable
Written by Jose Llarena
Related protips
4 Responses
What is the benefit?
The benefit is that you dont have to implement hashCode, equals or toString for new classes, which is one of the (many) reasons java is more verbose than other languages.
I don't like this method too much, I can suggest you to use Lombok (http://projectlombok.org/) it's a very interesting and useful tool! With it you can have the same (and many others) benefits with a much cleaner code.
Hi Rascio,
You dont say why you dont like it so not sure how to respond to that. I looked at project lombok and indeed its a terser way of achieving the same effect (thought its scope its larger than this simple trick). The benefit of the approach above is that it is dead simple and under your control, plus you have one less jar dependency to worry about.