+
+
+ abstract public boolean equalsSpecific( Object o );
+
+ final public boolean equals( Object o ) {
+ if( o == null ) {
+ return false;
+ }
+
+ if( !(o instanceof Canonical) ) {
+ return false;
+ }
+
+ Canonical c = (Canonical) o;
+
+ if( this.canonicalValue == 0 ||
+ c.canonicalValue == 0
+ ) {
+ return equalsSpecific( o );
+ }
+
+ return this.canonicalValue == c.canonicalValue;
+ }
+