6

エンコーディングに対応する列挙型があります。列挙型にエンコーディングの繰り返し数値がないことを確認する必要があります。

public enum EncodingsEnum
{

ISO8859_1("ISO-8859-1",0), ISO8859_2("ISO-8859-2",1),
    ISO8859_3("ISO-8859-3",2), ISO8859_4("ISO-8859-4",3),
    ISO8859_5("ISO-8859-5",4), ISO8859_6("ISO-8859-6",5),
    ISO8859_7("ISO-8859-7",6), ISO8859_8("ISO-8859-8",7),
    ISO8859_9("ISO-8859-9",8), ISO8859_11("ISO-8859-11",9),
    ISO8859_13("ISO-8859-13",10),ISO8859_15("ISO-8859-15",11),
    UTF_8("UTF-8",11);

    public static final int ENCODINGS_COUNT = EncodingsEnum.values().length;
    private final String encodingName;
    private final int encodingNumber;

    EncodingsEnum(final String encodingName,int encodingNumber)
    {
        ReferenceChecker.checkReferenceNotNull(encodingName);

        this.encodingName = encodingName;
        this.encodingNumber = encodingNumber;
    }

    public static String getEncodingNameByNumber(int number)
    {
        for(EncodingsEnum encoding : EncodingsEnum.values())
        {
            if(encoding.encodingNumber == number)
            {
                return encoding.getEncodingName();
            }
        }
        throw new RuntimeException("Encoding with this number isn't supported:" + number);

    }

    public static int getEncodingNumberByName(final String name)
    {
        for(EncodingsEnum encoding : EncodingsEnum.values())
        {
            if(encoding.encodingName.equals(name))
            {
                return encoding.getEncodingNumber();
            }
        }
        throw new RuntimeException("Encoding with this name isn't supported:" + name);
    }

    public String getEncodingName()
    {
        return this.encodingName;
    }

    public int getEncodingNumber()
    {
        return this.encodingNumber;
    }
}

既存のエンコーディングの 1 つと同じ番号のエンコーディングを作成できるという問題があるため、enum にこの番号の要素が含まれていることを確認し、例外をスローする必要があります。

4

3 に答える 3

8

これは実行時にチェックすべきではありません: 手遅れになるでしょう。列挙値を反復処理する単体テストを追加し、すべての値が異なることを確認します。また、アプリケーション/ライブラリの新しいバージョンを生成する前に、常に単体テストを実行し、合格することを確認してください。

@Test
public void encodingNumbersMustBeUnique() {
    Set<Integer> numbers = new HashSet<Integer>();
    for (EncodingsEnum e : EncodingsEnum.values()) {
        assertFalse(numbers.contains(e.getEncodingNumber()));
        numbers.add(e.getEncodingNumber());
    }
}
于 2012-07-13T09:21:48.487 に答える
1

コンストラクターでは、enum の encodingNumbers を繰り返し処理し、重複が見つかった場合は例外をスローできます。このようなもの:

public boolean isPresent(String type){
            ClassType[] typeArray = ClassType.values();
            for(ClassType cType: typeArray){
                if(cType.absoluteName/*this is some private field of the class*/.equalsIgnoreCase(type)){
                    return true;
                }
            }
            return false;
        }

コンストラクターで番号と名前を割り当てる直前に、上記のチェックを入れます。チェックが true を返した場合、例外をスローします。

于 2012-07-13T09:31:37.137 に答える
0

このコードで解決しました。

public enum EncodingsEnum {
     ONE(1),
     TWO(1);

     private int number;

     static {
      if (!test()) {
       throw new RuntimeException();
      }
     }

     private EncodingsEnum(int number) {
      this.number = number;
     }

     public static boolean test() {
      final Set<Integer> numbers = new HashSet<Integer>();

      for (final EncodingsEnum enc : EncodingsEnum.values()) {
       numbers.add(enc.number);
      }

      return numbers.size() == EncodingsEnum.values().length;
     }
于 2012-07-13T11:51:53.270 に答える