2017-10-25 2 views
1

Ich muss eine relativ große Anzahl von Kategorien definiert haben (ungefähr 30 beim Start, wir werden mehr hinzufügen). Betrachten Sie diesen Code:Ist das eine gute Praxis? (Klassenfelder)

public class Category { 

    public static final Category DRESS = new Category("Dress"); 
    public static final Category SKIRT = new Category("Skirt"); 
    ... 

    private static final List<Category> CATEGORIES = Arrays.aslist(DRESS, SKIRT, ...); 

    private String name; 

    public Category(String name) { 
     this.name = name; 
    } 

    //Some static public method to iterate over categories 
    ... 

Ich brauche die Kategorien erklärt haben, und wir müssen auch einen Weg, über ihnen zu wechseln. Ich verwerfe die Reflexion, weil ich denke, dass es keine sehr gute Übung ist.

Wird ein großer Name von statischen Endfeldern der gleichen Klasse deklariert und auch in einer Liste eine gute Praxis? Als eine Alternative dachte ich darüber nach, eine Map<Integer, Category> anstelle der Liste zu haben, und die Felder waren ganze Zahlen, die jede Kategorie identifizieren würden, also würden Sie die Kategorien bekommen, indem Sie sie in die Karte bringen. Wäre dies in Bezug auf Zeit und Raumleistung besser?

PS: Es ist für ein Android-Projekt, wenn es etwas

+1

Klingt wie ein Job für einen 'enum'. –

+0

Verwenden Enum sollte in Android vermieden werden, nehme ich an. Obwohl du recht hast. – vader

+0

Ich denke, dass die Antwort von ששש אאבב אאךך die beste Option ist. Ich weiß nichts über Leistung, aber der Enum-Ansatz gibt Ihnen viel saubereren Code und macht Ihr Leben so viel besser. Ich denke, das ist einen kleinen Aufwand wert, wenn es einen hat. – ShahiM

Antwort

3

Betrachten Sie diesen Code:

public class Category { 

    public static final Category DRESS = new Category("Dress"); 
    public static final Category SKIRT = new Category("Skirt"); 

Ja das ist buchstäblich, was Aufzählungen im Hintergrund zu tun, so

public enum Category { 
    DRESS("Dress"), 
    SKIRT("Skirt"), 
    ...; 

    private String name; 

    private Category(String name) { 
     this.name = name; 
    } 

    // Category.values() returns the elements as an array 
0

Für kleine Liste ändert, ist es in Ordnung ist List oder Map zu verwenden.

Aber für eine große Liste möchten Sie vielleicht in einer Datenbank speichern. Ich würde sagen, mit einem List gut genug

Auch ArrayList von String wird als etwas effizienter sein ArrayList von Category

1

verwenden.

Sie sollten eine Map nur prüfen, ob Sie eine insbesondere Category nachschlagen müssen sehr häufig über einige Schlüsseleigenschaft (wie ein int Ihrem Fall).

Wenn es keine Eigenschaften oder Methoden in der Category Klasse betrachten sie nur Strings mit ersetzen.

Wenn zur Laufzeit neue Categories erstellt werden und Sie diese beibehalten möchten, sollten Sie einen DB oder eine Datei verwenden, um die Kategorien zu speichern.

Edit: Die Beantwortung der Frage im Kommentar

Das auf der Category Klasse abhängen würde. Wenn der einzige Zweck darin besteht, alle Kategorien aufzulisten, und die Klasse selbst keine anderen Instanzmethoden oder -eigenschaften hat, dann ist die Klasse Integer und Category hinsichtlich der räumlichen Komplexität ähnlich (da in einer Map Ganzzahl in der Integer Klasse eingerahmt wird Objekt)

Ich würde immer noch vorschlagen, dass Sie eine Klasse namens Category und eine Liste verwenden, wenn der Zweck nur über sie iterieren und/oder bestimmte Instanzen der Category Klasse an anderer Stelle in Ihrer Anwendung z. Category.SOME_CATEGORY.

Das folgende Beispiel ist ein guter Anwendungsfall

someMethod(Category category) { 
    // do something 
} 

gegen

someMethod(int category) { 
    // before doing anything 
    // lookup this category by an int key 
    // in the the Map<Integer, Category> 
} 

Das Problem mit diesem ist, dass Sie alle int passieren könnte, die für kein gültiger Schlüssel sein kann oder eine Kategorie. Die Verwendung einer Klasse gibt ein bisschen mehr für die zusätzliche Kompilierzeitprüfung. Man könnte aber auch immer einen int def verwenden. Aber ich wiederhole noch einmal, dass alles darauf hinausläuft, ob die Klasse Category irgendwelche Instanzmethoden oder -eigenschaften hat.

+0

Der Zweck des Hinzufügens einer Map besteht darin, dass die Felder weniger Platz einnehmen würden, da sie Integer anstelle von Category-Objekten wären. Ich frage, ob das korrekt wäre und ob es – xBlackout

+0

wert wäre @xBlackout die Antwort bearbeitet – vader

2

Sie sollten enum verwenden stattdessen ein Objekt zu schaffen, mit new Category("Dress");, weil das Erstellen eines Objekts teuer ist als mit enum. Java Aufzählungen sind eher wie Klassen implementiert, so können Sie Ihren Code nahtlos ändern:

public enum Category { 
    DRESS("Dress"), SKIRT("Skirt"); 

    private final String name; 

    Category(String name) { 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 
} 

Hinweis:
Der Konstruktor für einen Aufzählungstyp muss Paket-private oder privaten Zugang sein. Es erstellt automatisch die Konstanten, die am Anfang des Enum-Körpers definiert sind. Sie können einen Enum-Konstruktor nicht selbst aufrufen.

mehr über ENUM Lesen bei Enum Types

+1

Ich wusste nicht, dass Sie dies mit einem Enum tun können. Er hat mir eine Menge Hacky-Codierung erspart. Dank bro. * Geist = Geblasen *. – ShahiM

+1

Gute Lösung. Ich wähle EpicPandaForce, weil er den Kommentar mit Category.values ​​() hinzugefügt hat, aber das ist genauso nützlich. Vielen Dank! – xBlackout

+0

@ShahiM: Gern geschehen;) –

Verwandte Themen