2016-04-08 5 views
0

Ich verarbeite derzeit eine riesige Dateneingabe, einschließlich vieler Werte, die ich in Getter für die spätere Verwendung erhalten möchte.Enum-Getter gegen Getter für jeden Status

Nachdem ich ein paar Methoden geschrieben hatte, fragte ich mich, ob es vielleicht eine bessere Idee wäre, nur eine get-Methode mit einer enum-Klasse zu verwenden, die alle möglichen Werte enthält, z.

public double getStat(StatType st) { 
    if(st != null) 
     return st.getValue(); 
} 

statt

public double getAvgReflection() { 
    return ... 
} 

public double getMaxLifesteal() { 
    return ... 
} 

Gibt es eine Konvention für eine der beiden Möglichkeiten verwenden? Irgendwelche Vorteile?

Vielen Dank im Voraus!

Antwort

1

Die "Konvention", nach der Sie fragen, läuft auf die Verwendung und Definition Ihrer Werte hinaus. Wenn Sie die Werte Enums vornehmen, müssen Sie sie als behandeln. Das heißt, die Felder in Ihrer Klasse müssten als solche definiert werden:

private MyEnum avgReflection; 
private MyEnum maxLifesteal; 
... 
public MyEnum getAvgReflection { 
    return this.avgReflection; 
} 

Und so weiter.

Jetzt könnten Sie Ihre Enums doppelte Werte zurückgeben, aber diese Werte sind statisch. Ich glaube nicht, dass Sie sich Gedanken über statische Werte machen, sondern vielleicht eine statische Menge von Werten.

Sie haben dann zwei Möglichkeiten: deklarieren alle möglichen Parameter wie Felder oder ein Aggregatfeld erstellen, um alle Werte zu halten und dann eine Enum als Index verwenden:

public enum MyEnum { 
    averageReflection(0), 
    maximumLifeSteal(1); 
    private int value; 
    private MyEnum(int value) { 
     this.value = value; 
    } 
    public int getValue() { 
     return this.value; 
    } 
} 
... 
private double[] attributes = new double[100]; // arbitrary initialization 
public double getAttribute(MyEnum attribute) { 
    return this.attributes[attribute.getValue()]; 
} 

Die beiden Einschränkungen auf einem Array (Angenommen, Sie möchten primitive Werte, und Sie sind um die Leistung besorgt), müssen alle Werte vom selben Typ sein, und die Anzahl der Attribute wird zur Kompilierzeit festgelegt.

Zusätzlich können Sie wollen einfach nur eine Karte < String verwenden, Doppel > oder Karte < MyEnum, Doppel > oder sogar < MyEnum Karte, Objekt >. Ein Kartentyp gibt Ihnen die Möglichkeit, einen Satz mit einer dynamischen Größe beizubehalten und möglicherweise auch mehrere Typen zu halten (mit dem kostspieligen Aufwand, Ihre Werte zu konvertieren).

Sie sollten Ihre Entscheidung auf die Anzahl der Attribute, die Sie zu halten, die Art von Overhead, die Sie bereit sind zu tolerieren, und Ihren Stil basieren.

2

Mit einem Enum maxes ist es einfacher, neue Statistiken hinzuzufügen, fügen Sie einfach eine Konstante in der Enum hinzu. Aber alle Statistiken müssen sich genauso verhalten, d. H. In Ihrem Beispiel doppelt sein. Was passiert, wenn Sie einen Int-Stat hinzufügen möchten?

+0

Vielen Dank! Alle von ihnen sind numerische Werte, und ich sehe nicht, dass neue bald hinzugefügt werden; für die Überlieferung und den Rest, ich denke, ich wäre besser, eine getrennte Getter – AscendedKitten

+0

gut eine ganze Zahl ist perfekt darstellbar als eine "Doppel", so würde es kein Problem sein – Moira