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 PLUSMINUSswitch。我通过BankOperation获得了getBankOperation(5, 20);,以便可以继续。

我想知道是否可以在enum而不是switch上使用方法,以便可以通过

BankOperation bankOperation = BankOperation.forOldAndNewAmount(5, 20).startProcessing();


哪里


  BankOperation初始化枚举并使forOldAndNewAmount(5, 20) delta成为枚举15private int delta字段
  
  BankOperationstartProcessing()的抽象method,它根据BankOperation执行System.out.println(String.format("Adding/Withdrawing %s dollars", delta));


我发现最困难的是-在BankOperation正文中打印delta 15而不将其作为enum的参数-在startProcessing()中返回PLUSMINUS 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 deltaBankOperation字段
  用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/

10-10 17:18