2008-09-26 12 views
25

ich eine Methode haben können sagen:Java: Enum Parameter in Methode

private static String drawCellValue(
    int maxCellLength, String cellValue, String align) { } 

und wie Sie feststellen können, ich habe einen Parameter namens align. Innerhalb dieser Methode werde ich einige wenn Bedingung, ob der Wert ist ein "links" oder "rechts" .. Einstellen des Parameters als String, natürlich kann ich jeden String-Wert übergeben .. Ich würde gerne wissen, ob es möglich ist einen Enum-Wert als Methodenparameter haben, und wenn ja, wie?

Nur für den Fall, dass jemand darüber nachdenkt; Ich habe darüber nachgedacht, einen booleschen Wert zu verwenden, aber das gefällt mir nicht wirklich. Erstens, wie wahr/falsch mit links/rechts zu verbinden? (Ok, ich kann Kommentare verwenden, aber ich finde es immer noch schmutzig) und zweitens könnte ich mich entscheiden, einen neuen Wert hinzuzufügen, wie 'justify'. Wenn ich also mehr als 2 mögliche Werte habe, ist der Boolesche Typ definitiv nicht möglich.

Irgendwelche Ideen?

+4

+1 für nicht wollen booleans & Kommentare verwenden - danke, guter Herr. – wchargin

Antwort

56

Dies sollte es tun:

private enum Alignment { LEFT, RIGHT };  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    if (align == Alignment.LEFT) 
    { 
    //Process it... 
    } 
} 
1

Sicher, Sie eine ENUM nutzen könnten. Würde so etwas wie die folgende funktionieren?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

private static String drawCellValue (int maxCellLength, String Cellvalue, Ausrichtung Ausrichtung) {}

Wenn Sie einen boolean verwenden wollten, könnten Sie die align Parameter so etwas wie Alignleft umbenennen. Ich stimme zu, dass diese Implementierung nicht so sauber ist, aber wenn Sie nicht viele Änderungen vorwegnehmen und dies keine öffentliche Schnittstelle ist, könnte dies eine gute Wahl sein.

1

Sie können auch SwingConstants {LEFT, RIGHT} wiederverwenden. Sie sind keine Enums, aber sie existieren bereits und werden an vielen Orten verwendet.

19

Noch cooler mit Aufzählungen Sie Schalter verwenden:

switch (align) { 
    case LEFT: { 
     // do stuff 
     break; 
    } 
    case RIGHT: { 
     // do stuff 
     break; 
    } 
    default: { //added TOP_RIGHT but forgot about it? 
     throw new IllegalArgumentException("Can't yet handle " + align); 

    } 
} 

Aufzählungen sind cool, weil der Ausgang der Ausnahme wird der Name des ENUM-Wertes, anstatt ein willkürlicher int-Wert.

4

Ich mag das viel besser. reduziert die if/switch, einfach tun.

private enum Alignment { LEFT, RIGHT; 

void process() { 
//Process it... 
} 
};  
String drawCellValue (int maxCellLength, String cellValue, Alignment align){ 
    align.process(); 
} 

natürlich es sein kann:

String process(...) { 
//Process it... 
} 
+4

+1 Die Idee ist auf dem richtigen Weg. Die Prozessmethode sollte jedoch abstrakt sein, und LINKS und RECHTS sollten jeweils eine Implementierung davon bereitstellen. –

+1

@ ChrisJester-Young Das hängt von ihrer Ähnlichkeit ab. Wenn sie ziemlich ähnlich sind, bieten die möglichen Werte möglicherweise nur eine private Methode, die einen Teil der Implementierung ausführt, und 'process()' erledigt die Hauptarbeit und ruft diese bei Bedarf auf. – glglgl

+0

@glglgl Richtig, das klappt auch. Ich möchte einfach keinen Code wie 'if (this == LEFT)' sehen, das ist alles. :-) –

1

Ich bin nicht sicher, ich würde eine ENUM als vollwertigen Klasse gehen und nutzen - das ist eine objektorientierte Sprache, und einer von Die grundlegendste Lehre der Objektorientierung ist, dass eine Klasse eine Sache gut machen sollte.

Ein Enum macht einen ziemlich guten Job, ein Enum zu sein, und eine Klasse macht einen guten Job als Klasse. Die beiden zu mischen, die ich fühle, bringt Sie in Schwierigkeiten - zum Beispiel können Sie eine Instanz einer Aufzählung nicht als Parameter an eine Methode übergeben, vor allem, weil Sie keine Instanz einer Aufzählung erstellen können.

Also, obwohl Sie möglicherweise in der Lage sein, enum.process() bedeutet nicht, dass Sie sollten.

1

Sie können eine ENUM in verwenden diese Parameter wie folgt aus:

public enum Alignment { LEFT, RIGHT } 
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {} 

dann können Sie entweder einen Schalter oder eine if-Anweisung verwenden, um tatsächlich etwas zu tun, sagte Parameter.

switch(align) { 
case LEFT: //something 
case RIGHT: //something 
default: //something 
} 

if(align == Alignment.RIGHT) { /*code*/}