...
Code Block | ||
---|---|---|
| ||
public final class Card implements Comparable{ private String suit; private int rank; public Card(String s, int r) { if (s == null) throw new NullPointerException(); suit = s; rank = r; } public boolean equals(Object o) { if (o instanceof Card){ Card c=(Card)o; return suit.equals(c.suit) && (rank == c.rank); } return false; } //this method fulfills its contract public int compareTo(Object o){ if (o instanceof Card){ Card c=(Card)o; if(suit.equals(c.suit)) return c.rank - rank; return suit.compareTo(c.suit); } throw new ClassCastException(); } public static void main(String[] args) { Card a = new Card("Clubs", 2); Card b = new Card("Clubs", 2); Card c = new Card("Hearts", 7); System.out.println(a.compareTo(b)); //returns 0 System.out.println(a.compareTo(c)); //returns a negative number System.out.println(b.compareTo(c)); //returns a negative number } } |
Exceptions
MET34-EX1: In some situations it may be necessary to violate the condition that (x.compareTo ==0) == (x.equals )
. However, as this will make an object Comparable that should not be used in most data structures that deal with Comparable objects like TreeSet
and TreeMap
, it would be better to use a separate method entirely. If compatibility issues demand the use of this non-standard compareTo()
method, care should be taken through comments or other means that the object is not used in data structures that expect a standard Comparable
.
Risk Assessment
Violating the general contract when implementing the compareTo()
method can lead to unexpected results, possibly leading to invalid comparisons and information disclosure.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
MET30-J | medium | unlikely | medium | P2 P4 | L3 |
Automated Detection
TODO
...