Domanda

Ho un metodo, diciamo:

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

e come puoi notare, ho un parametro chiamato align. All'interno di questo metodo avrò qualche condizione if sul fatto che il valore sia 'left' o 'right' .. impostando il parametro come String, ovviamente posso passare qualsiasi valore di stringa .. Vorrei sapere se è possibile avere un valore Enum come parametro del metodo e, in tal caso, come?

Nel caso in cui qualcuno ci pensi; Ho pensato di usare un valore booleano ma non mi piace davvero. Innanzitutto, come associare vero / falso a sinistra / destra? (Ok, posso usare i commenti ma lo trovo ancora sporco) e in secondo luogo, potrei decidere di aggiungere un nuovo valore, come "giustificare", quindi se ho più di 2 valori possibili, il tipo booleano non è assolutamente possibile utilizzare.

Qualche idea?

È stato utile?

Soluzione

Questo dovrebbe farlo:

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

Altri suggerimenti

Ancora più bello con gli enumerati puoi usare switch:

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

   }
}

Gli enum sono interessanti perché l'output dell'eccezione sarà il nome del valore enum, piuttosto che un valore int arbitrario.

Mi piace molto di più. riduce if / switch, basta fare.

private enum Alignment { LEFT, RIGHT;

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

ovviamente, può essere:

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

Certo, potresti usare un enum. Qualcosa come il seguente lavoro?

enum Alignment {
    LEFT,
    RIGHT
}

drawCellValue stringa statica privata (int maxCellLength, String cellValue, allineamento di allineamento) {}

Se si desidera utilizzare un valore booleano, è possibile rinominare il parametro align in qualcosa di simile a alignLeft. Concordo sul fatto che questa implementazione non è così pulita, ma se non si prevedono molti cambiamenti e questa non è un'interfaccia pubblica, potrebbe essere una buona scelta.

Puoi anche riutilizzare SwingConstants. {SINISTRA, DESTRA}. Non sono enumerazioni, ma esistono già e sono utilizzate in molti luoghi.

Non sono troppo sicuro che userei un enum come classe a tutti gli effetti - questo è un linguaggio orientato agli oggetti, e uno dei principi di base dell'orientamento agli oggetti è che una classe dovrebbe fare una cosa e farlo bene .

Un enum sta facendo un ottimo lavoro come enum e una classe sta facendo un buon lavoro come classe. Mescolare i due che provo ti metterà nei guai - per esempio, non puoi passare un'istanza di un enum come parametro a un metodo, principalmente perché non puoi creare un'istanza di un enum.

Quindi, anche se potresti essere in grado di enum.process () non significa che dovresti.

Puoi usare un enum in questi parametri come questo:

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

allora puoi usare uno switch o un'istruzione if per fare effettivamente qualcosa con detto parametro.

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

if(align == Alignment.RIGHT) { /*code*/}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top