我有一个用例,其中迭代 Java 枚举和测试,参数包含在枚举列表中,它是一个静态方法,这个线程安全吗?

public enum EnumType {

    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE;

    public static boolean isValid(String input) {
        for (EnumType type : EnumType.values()) {
            if (input.equals(type.toString())) {
                return true;
            }
        }
        return false;
    }
}

最佳答案

EnumType.values() 返回所有枚举常量的副本,因此即使您修改 values() 返回的数组,它也不会影响任何其他线程。

字节码证实了这一点:

public static values()[Lcom/example/EnumType;
 L0
  LINENUMBER 43 L0
  GETSTATIC com/example/EnumType.$VALUES : [Lcom/example/EnumType;
  INVOKEVIRTUAL [Lcom/example/EnumType;.clone ()Ljava/lang/Object;
  CHECKCAST [Lcom/example/EnumType;
  ARETURN
  MAXSTACK = 1
  MAXLOCALS = 0

线路:
INVOKEVIRTUAL [Lcom/example/EnumType;.clone ()Ljava/lang/Object;

调用 Array.clone() 方法,该方法返回数组的浅拷贝

10-06 06:42