В вашем реальном примере getBankOperation()
- это обработка, за которую должно отвечать перечисление BankOperation
.
Вам не нужен экземпляр Bank
для его обработки.
Так что просто переместите этот метод какстатический метод перечисления:
enum BankOperation { PLUS, MINUS;
public static BankOperation getBankOperation(int oldAmount, int newAmount) {
BankOperation operation = newAmount >= oldAmount ? BankOperation.PLUS : BankOperation.MINUS;
int delta = Math.abs(newAmount - oldAmount);
switch (operation) {
case PLUS:
System.out.println(String.format("Adding %s dollars", delta));
break;
case MINUS:
System.out.println(String.format("Withdrawing %s dollars", delta));
break;
}
return operation;
}
};
Теперь вы можете сделать:
BankOperation bankOperation = BankOperation.getBankOperation(5, 20);
Дополнительно эту часть можно переместить в метод перечисления:
switch (operation) {
case PLUS:
System.out.println(String.format("Adding %s dollars", delta));
break;
case MINUS:
System.out.println(String.format("Withdrawing %s dollars", delta));
break;
}
Itвыдаст:
enum BankOperation {
PLUS {
public String getOutput(int delta) {
return String.format("Adding %s dollars", delta);
}
},
MINUS {
@Override
public String getOutput(int delta) {
return String.format("Withdrawing %s dollars", delta);
}
};
public abstract String getOutput(int delta);
public static BankOperation getBankOperation(int oldAmount, int newAmount) {
BankOperation operation = newAmount >= oldAmount ? BankOperation.PLUS : BankOperation.MINUS;
int delta = Math.abs(newAmount - oldAmount);
System.out.println(operation.getOutput(delta));
return operation;
}
}
О вашем комментарии:
Возможно ли, вы дадите мне знать, как добиться "превращения дельты в private int delta
поле перечисленияBankOperation
при инициализации с помощью forOldAndNewAmount(5, 20)
, тогда я могу вызвать startProcessing()
в цепочке, не делая его параметром "?
Вы не должны этого делать, потому что перечисления представляют постоянные значения.Перезаписанные значения перечислений во время обработки неясны и могут создать побочные эффекты, если ваше приложение является многопоточным или станет многопоточным.
В качестве альтернативы вы можете использовать класс, который переносит BankOperation
и дельту (BankOperationComputed
) и чтоforOldAndNewAmount()
возвращается.
BankOperation getBankOperation()
будет лучше называться BankOperationComputed computeBankOperation()
:
public static BankOperationComputed computeBankOperation(int oldAmount, int newAmount) {
BankOperation operation = newAmount >= oldAmount ? BankOperation.PLUS : BankOperation.MINUS;
int delta = Math.abs(newAmount - oldAmount);
return new BankOperationComputed(operation, delta);
}
BankOperationComputed
public class BankOperationComputed {
private final BankOperation operation;
private final int delta;
BankOperationComputed (BankOperation operation, int delta){
this.operation = operation;
this.delta = delta;
}
public void startProcessing(){
System.out.println(operation.getOutput(delta));
}
}
Теперь вы можете сделать это:
BankOperation.computeBankOperation(5, 20) // returns BankOperationComputed
.startProcessing(); // uses the enum under the hoods