Ho fatto una domanda sull'estensione di TreeMaps in TreeMaps "ordina per valore" sul sito "revisione codice" su StackOverflow. Sulla base della risposta, ho riscritto il codice. Mi piace. Ma sembra che io stia usando solo trucchi. O forse questo è un modo legittimo per scrivere software? Qualcuno può dare un'occhiata:
public class ToolBox {
public interface SortedMapByValue {
void put(Object key, Integer val);
Set<Map.Entry<Object, Integer>> entrySet();
}
public static SortedMapByValue getInstanceSortedMapByValue() {
class MyComp implements Comparator {
Map<Object, Integer> sharedMap;
public int compare(Object key1, Object key2) {
if(key1.equals(key2)) { return 0; }
Integer val1 = sharedMap.get(key1);
Integer val2 = sharedMap.get(key2);
if(val1 > val2) return -1;
return 1;
}
}
class MyMap<K> extends TreeMap<K, Integer> {
Map<Object, Integer> sharedMap = new HashMap<Object, Integer>();
MyMap(Comparator comp) {
super(comp);
}
@Override
public Integer put(K key, Integer val) {
if(sharedMap.containsKey(key)) {
super.remove(key);
val += sharedMap.get(key);
}
sharedMap.put(key, val);
super.put(key, val);
return val;
}
}
class TreeMapByValue implements SortedMapByValue {
private MyMap<Object> realMap;
public TreeMapByValue(MyMap myMap) { this.realMap = myMap; }
public void put(Object key, Integer val) {
realMap.put(key, val);
}
public Set<Map.Entry<Object, Integer>> entrySet() {
return realMap.entrySet();
}
}
MyComp myComp = new MyComp();
MyMap<Object> myMap = new MyMap(myComp);
myComp.sharedMap = myMap.sharedMap;
SortedMapByValue treeMapByValue = new TreeMapByValue(myMap);
return treeMapByValue;
}
}
La domanda è se sia giusto scrivere classi fragili e che rompono le apis di una classe super, a patto che le sposti in un metodo statico? TreeMapByValue non interrompe la relazione "è una" con TreeMap solo perché lo nascondo. Sembra un trucco, ma forse è un modo standard per programmare? Non lo so.
btw: il titolo si riferisce al mio volere l'algoritmo di ordinamento "rosso-nero" di TreeMap, ma non volevo quello che dice l'API riguardo all'ordinamento. Ho mantenuto l'algoritmo, ma ho rotto l'api. Ma poi mi sono nascosto facendo questo.
Si prega di ignorare la mia completa ignoranza dei farmaci generici. Li studierò abbastanza presto.