8

私はJavaでそのような列挙型クラスを持っています

    public enum MockTypes
    {
        // Atlantis mocks
        ATLANTIS_VERIFY("ATLANTIS", "verify"),
        ATLANTIS_CREATE_RECORD("ATLANTIS", "createRecord"),

    ...

        private String m_adaptor;

        private String m_step;

private MockTypes( String adaptor, String step)
    {
        m_adaptor = adaptor;
        m_step = step;
    }

             public String getAdaptor()
        {
            return m_adaptor;
        }

        public String getStep()
        {
            return m_step;
        }

アダプタとステップパラメータによって列挙値を返すメソッドを実装する必要があります。

public MockTypes getMockTypeByName(String adaptor, String step)

でもどうしたらいいかわかりません。誰かが私を助けてもらえますか?

4

3 に答える 3

14
public MockTypes getMockTypeByName(String adaptor, String step)
{
    for(MockTypes m : MockTypes.values())
    {
        if(m.getAdaptor().equals(adaptor) && 
           m.getStep().equals(step)) return m;
    }
    return null;
}
于 2012-10-10T23:13:17.697 に答える
2

値の検索を伴わない「定数時間」ソリューションが必要な場合は、クラスMapの静的ブロックで定数を初期化するのが最善のオプションです。MockType

Guavaを使用する場合は、実際には比較的快適です。

public enum MockType {
  ...

  private static final ImmutableTable<String, String, MockType> LOOKUP_TABLE;

  static {
    ImmutableTable.Builder<String, String, MockType> builder =
      ImmutableTable.builder();
    for (MockType mockType : MockType.values()) {
      builder.put(mockType.getAdaptor(), mockType.getStep(), mockType);
    }
    LOOKUP_TABLE = builder.build();
  }

  public static MockType getMockType(String adaptor, String step) {
    return LOOKUP_TABLE.get(adaptor, step);
  }
}

(開示:私はグアバに貢献します。)

代替案は比較的似ています-Map<String, Map<String, LookupType>>静的ブロックでaを構築し、そこからルックアップを実行します-多少多くの作業が必要になりますが。

于 2012-10-11T00:26:38.577 に答える
1

enumのメソッドを使用values()して、定義されたすべての値のリストを取得できます。次に、このリストをループして、メソッドにパラメーターとして送信された値と一致する、関心のある値を見つけることができます。

于 2012-10-10T23:05:17.600 に答える