Frage

In meiner Java-Codierung, habe ich oft mit mehrere Map<String,Map<String,foo>> oder Map<String,List<String>> am Ende und dann habe ich Probleme Erinnern, den String ist, welche Taste. Ich kommentieren Sie die Erklärung mit //Map<capabiltyId,Map<groupId,foo>> oder //Map<groupId,List<capabilityId>, aber es ist nicht die beste Lösung. Wenn String nicht endgültig ist, würde ich neue Klassen CapabilityId extends String und GroupId extends String machen, aber ich kann es nicht. Gibt es eine bessere Möglichkeit, den Überblick zu behalten, welche Sache der Schlüssel ist, und vielleicht die Compiler es erzwingen hat?

War es hilfreich?

Lösung

Statt mit CapabilityId String erweitern, CapabilityId könnte ein String Feld umfasst "id" genannt; dann Map als Map<CapabilityId, Map<GroupId, Foo>> definiert werden könnten, und Sie an den einzelnen ID-Felder durch einen getId() auf Ihrem Schlüssel Klassen bekommen konnte.

Ich bin nicht sicher, würde ich dies selbst tun, aber wenn ich es tue, das ist wahrscheinlich das, was ich tun würde.

Sie können die Unordnung begrenzen, indem eine abstract GenericId Klasse mit einem ID-Feld und getId() Verfahren mit und haben CapabilityId und GroupId vererben es.

Andere Tipps

Wrap-Strings in Wrapper-Klassen, wenn Sie wollen:

class GroupId implements Comparable {
   private String groupId;

   public GroupId (String groupId) {
       this.groupId = groupId;
   }
   ...
}

Map<GroupId, List<CapabilityId>> m = ...

Eine ID Klasse, die Sie Unterklasse können, und das aus einem String Feld und Implementierungen von equals() und hashCode(), die dieses Feld verwendet werden.

würde ich alles in einzelner Klasse und nutzen sensible Feld / Methode / Argumentnamen setzen.

public class GroupCapabilities {
    private Map<String, Map<String, Group>> groupCapabilities;

    public void addGroup(String capabilityId, Group group) {
        Map<String, Group> groups = groupCapabilities.get(capabilityId);
        if (groups = null) {
            groups = new HashMap<String, Group>();
            groupCapabilities.put(capabilityId, group);
        }
        groups.put(group.getId(), group);
    }

    public Map<String, Group> getGroups(String capabilityId) {
        return groupCapabilities.get(capabilityId);
    }

    public Group getGroup(String capabilityId, String groupId) {
        Map<String, Group> groups = groupCapabilities.get(capabilityId);
        return (groups != null) ? groups.get(groupId) : null;
    }

    // Etc..
}

Auf diese Weise die Sie bei Methode / Argumentnamen sehen können, was sie erwartet / Returns.

Es gibt eine Reihe von Möglichkeiten, auf diese zu gehen (einige bereits erwähnt):

  • Wie @Roman, wickeln Sie das Mehrzweck-Typ in einen spezifischeren Typ, die stärker Typisierung gibt. Starke Typisierung gut, meiner Meinung nach.
  • Wie @nanda, verwenden Sie eine spezifischere Kollektionstyp. Die Java-Bibliothek ist ein wenig schlecht in diesem Bereich. Es hängt davon ab, wie Sie über Abhängigkeiten fühlen.
  • Wie @BalusC bewegen sich alle ekligen Sachen in eine eklige Klasse. Nicht wirklich das Problem beheben, aber es es enthält (wie in Ghostbusters).
  • Map<String,Map<String,foo>> sieht sehr ähnlich wie Sie einen zusammengesetzten Schlüssel haben, das heißt ein Schlüssel, der aus zwei Teilen besteht. So führt eine unveränderliche Verbundschlüsselklasse, die ein Wertobjekt ist, die die Zwei-Komponenten-Wertobjekte.

Statt Map<String,List<String>> sollten Sie Multimap von Google Guava / Google-Sammlung verwenden

http : //google-collections.googlecode.com/svn/trunk/javadoc/index.html com / google / common / collect / Multimap.html

Hinzufügen von den anderen Antworten:

Lassen Sie sich einwickeln.

Es ist nicht nur eine Lösung für Ihr Problem, aber eine gute Idee, im Allgemeinen, das heißt avoid einfach Parameter. Ihr Code wird Lesbarkeit, geistige Gesundheit und Wartbarkeit gewinnen. Sie können alle Arten von schönen Eigenschaften, um es hinzuzufügen, z.B. erklären sie @Immutable. Wie Sie aus es auf diese Weise gefunden ist besser, sich zu erinnern und zu steuern. Sie besitzen die Klasse und können, was Sie wollen mit ihm tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top