enum BankOperation { PLUS, MINUS }
public 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;
}
注意:该示例故意简单,不能从使用
enum
方法中受益。我有两个
BankOperation
PLUS
和MINUS
和switch
。我通过BankOperation
获得了getBankOperation(5, 20);
,以便可以继续。我想知道是否可以在
enum
而不是switch
上使用方法,以便可以通过BankOperation bankOperation = BankOperation.forOldAndNewAmount(5, 20).startProcessing();
哪里
BankOperation
初始化枚举并使forOldAndNewAmount(5, 20)
delta
成为枚举15
的private int delta
字段BankOperation
是startProcessing()
的抽象method
,它根据BankOperation
执行System.out.println(String.format("Adding/Withdrawing %s dollars", delta));
我发现最困难的是-在
BankOperation
正文中打印delta
15
而不将其作为enum
的参数-在startProcessing()
中返回PLUS
和MINUS
enum
本身。 最佳答案
在您的实际示例中,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;
}
它会给:
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()
: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);
}
计算的BankOperation
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
关于java - 具有类主体和数据的枚举类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52014777/