다스 위에 긴 포함 정적 방법 (하여 멀티 스레드 애플리케이션을 고려 ... perpertual "긴-IF 또는 스위치" 딜레마의 변형 조건) 따라 값을 객체의 유형을 확인하고 반환 if
문,
public static String checkType(Class<?> type)
{
if (type == A.class)
{
return aString;
}
else if (type == B.class)
{
return bString;
}
...
else if (type == z.class)
{
return zString;
}
}
같은 즉, 뭔가 분명히 스위치 문은 매우 일반적인 패턴은 enum
을 가지고 호출하는 것입니다, 여기에 직접 적용 할 수 없습니다 그 valueOf()
, 즉 d O 따라서
public enum Strings
{
A(aString), B(bString), ..., Z(zString)
private final String value;
private Strings(String value)
{
this.value = value;
}
public String value()
{
return this.value;
}
}
같은는 checkType()
는 getActualTypeName()
있어서 내부 생산 코드 및 비 - 프리미티브 타입 일부 문자열 처리 첨가 null
값에 대한 적절한 검사와
public static String checkType(Class<?> type)
{
return Strings.valueOf(getActualTypeName(type.getClass().getName())).value();
}
로 다시 쓸 수있다 "class java.lang.Long"
과 같은 문자열에서 실제 형식 이름을 검색하려면 (예 : getName()
메서드는 예상되는 문자열을 반환합니다. valueOf()
는 스레드로부터 안전하지 않습니다 경우 "long"
는).
그러나,이 동시 환경에서 작동하지 않습니다. 같은가 (정상) Map
객체와 아마이 두 가지 대안이 같은 패턴의 변형은을 사용하여 적용, enum.valueOf()
때문에 분명히 Class.java
클래스
enumType.enumConstantDirectory().get(name);
를 호출
Enum.valueOf(Class<T> enumType, String name)
을 기반으로합니다.
,enumConstantDirectory()
메서드는 호출 할 때마다 values()
배열 복사본에서 만든 HashMap
을 반환합니다.
스레드 안전할까요?
Enum.valueOf() , 비동기지도를 찾습니다. Enum.valueOf() 메서드의 소스를 살펴보십시오. enumType.enumConstantDirectory(). get (name)을 호출합니다. – PNS
@PNS 더 자세히 살펴보면'enumConstantDirectory' (변수)가 휘발성임을 알 수 있습니다. 따라서지도가 안전하게 게시되고 구성 후 변경되지 않도록 충분히 보장 할 수 있습니다. 최악의 경우는 맵이 두 번 이상 생성되지만 최종 상태를 기반으로 작성되므로 결정적이므로 사용되는 지연 패턴을 사용하면 스레드를 안전하게 유지할 수 있습니다. – assylias
당신 말이 맞아요, 안전 할 것 같습니다. 어느 것이 좋니! :-) – PNS