18

Enum次のように定義された sを見つけました。

public Enum MyEnum {

   ONE
   {
      @Override
      public int getSomething() {
         return 1;
      } 
   },

   TWO
   {
      @Override
      public int getSomething() {
        return 2;
      }
   }

   int getSomething()
   {
      return 0;
   }
}

理想的には、この目的のためにフィールドを定義する必要があり、クラスは次のようになるはずだと思うので、どういうわけか、この実装にある種の不快感を覚えます。

public Enum MyEnum{

   ONE(1),
   TWO(2)

   private int theSomething;

   private MyEnum(int something) {
      theSomething = something;
   }

   int getSomething()
   {
      return theSomething;
   }
}

問題は、個人的な不快感を除けば、このコードを変更する正当な理由が見つからないことです。存在しますか?

4

2 に答える 2

26

(コメントから移動)

最初の例は、Javaで有限状態マシンを実装するために一般的に使用されます。if (state == FOO) {} else if (state == BAR)それは、などを持っている必要があるすべての方法の必要性を排除します

class MyFSM {

    enum State {
        FIRST_STATE {
            @Override
            void start(MyFSM fsm) {
                fsm.doStart();
            }
            @Override
            void stop(MyFSM fsm) {
                throw new IllegalStateException("Not Started!");
            }
        },
        SECOND_STATE {
            @Override
            void start(MyFSM fsm) {
                throw new IllegalStateException("Already Started!");
            }
            @Override
            void stop(MyFSM fsm) {
                fsm.doStop();
            }
        };

        abstract void start(MyFSM fsm);
        abstract void stop(MyFSM fsm);       
    }

    private volatile State state = State.FIRST_STATE;

    public synchronized void start() {
        state.start(this);
    }

    private void doStart() {
        state = SECOND_STATE;
    }

    public synchronized void stop() {
        state.stop(this);
    }

    private void doStop() {
        state = FIRST_STATE;
    }
}
于 2013-02-19T22:03:54.363 に答える
1

最初のパターンは、すべてをオーバーライドする必要がない「デフォルト」メソッドの場合にわずかに優れています。

public enum Modes {
    MODE_ONE {
        @Override public boolean canDoA() {
            return true;
        }
    },
    MODE_TWO {
        @Override public boolean canDoB() {
            return true;
        }
    },
    MODE_THREE {
        @Override public boolean canDoC() {
            return true;
        }
    };

    public boolean canDoA() {
        return false;
    }

    public boolean canDoB() {
        return false;
    }

    public boolean canDoC() {
        return false;
    }

}
于 2017-04-11T18:36:34.483 に答える