web-dev-qa-db-ja.com

Java:メソッドのEnumパラメーター

私は言うことができる方法があります:

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

お気づきのとおり、alignというパラメーターがあります。このメソッド内では、値が「左」または「右」であるかどうかのif条件があります。パラメータを文字列として設定すると、明らかに任意の文字列値を渡すことができます。それが可能かどうかを知りたいメソッドパラメータとしてEnum値を持つために、もしそうなら、どのように?

誰かがこれについて考える場合に備えて。ブール値を使用することを考えましたが、私は実際にはそれを空想しません。最初に、true/falseをleft/rightに関連付ける方法は? (OK、コメントを使用できますが、それでも汚れています)そして次に、「justify」などの新しい値を追加することを決定する可能性があります。したがって、2つ以上の可能な値がある場合、ブール型は間違いなく使用できません。

何か案は?

28
Jean Paul Galea

これはそれを行う必要があります:

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

あなたはスイッチを使用することができます列挙型でさらにクール:

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);

   }
}

例外の出力は、任意のint値ではなく、enum値の名前になるため、Enumはクールです。

20
Joshua DeWald

私はこれがずっと好きです。 if/switchを減らしてください。

private enum Alignment { LEFT, RIGHT;

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

もちろん、それは次のとおりです。

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

SwingConstants。{LEFT、RIGHT}も再利用できます。それらは列挙型ではありませんが、すでに存在し、多くの場所で使用されています。

1
Tom

もちろん、enumを使用できます。次のような作品はありますか?

enum Alignment {
    LEFT,
    RIGHT
}

private static String drawCellValue(int maxCellLength、String cellValue、Alignment alignment){}

ブール値を使用する場合は、alignパラメーターの名前をalignLeftなどに変更できます。この実装はそれほどきれいではないことに同意しますが、多くの変更を予期せず、これがパブリックインターフェイスでない場合は、良い選択かもしれません。

1
Michael Bobick

次のように、上記のパラメーターで列挙型を使用できます。

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

その後、switchまたはifステートメントを使用して、実際に上記のパラメーターで何かを行うことができます。

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

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

本格的なクラスとして列挙型を使用するかどうかはわかりません-これはオブジェクト指向言語であり、オブジェクト指向の最も基本的な考え方の1つは、クラスが1つのことを実行し、それをうまく実行することです。

列挙型は列挙型としてかなり良い仕事をしており、クラスはクラスとして良い仕事をしています。私が感じている2つを混ぜると問題が発生します-たとえば、主に列挙型のインスタンスを作成できないため、列挙型のインスタンスをパラメーターとしてメソッドに渡すことはできません。

したがって、enum.process()を使用できる場合でも、そうする必要があるとは限りません。

1