2010-12-02 1 views
1

나는과 같이 오버로드 방법을 사용하는 JCR API를 사용하고 있습니다 :개체 참조를 인스턴스 유형으로 자동 캐스팅하는 방법은 무엇입니까?

setProperty(String value) 
setProperty(Boolean value) 
setProperty(Integer value) 
... 

그때 String, Boolean, Integer 등 인스턴스를 포함 할 수있는 Collection<Object> 있습니다.

각 요소를 해당 인스턴스 유형의 올바른 setProperty 구현에 전달하여이 컬렉션을 반복하고 싶습니다. 과 OO 이념에서 벗어난 - -이 솔루션은 단순히 확장하지 않습니다

for (Object value : values) { 
    if (value instanceof String) node.setProperty((String) value); 
    if (value instanceof Boolean) node.setProperty((Boolean) value); 
    if (value instanceof Integer) node.setProperty((Integer) value); 
    ... 
} 

이제 추한 것 외에 : 확실한 방법은 다음과 같이한다. 이 특수한 경우에 효과가 있지만 유형 수가 증가하면 다루기 힘들어집니다.

마치 주조 작업을 자동으로 수행하기 위해 우아한 트릭이나 유틸리티가 있어야하는 것처럼 느낍니다.

답변

3

정상적으로 컴파일 타임에 수행되는 과부하 해결을 요구하기 때문에 아니요, 실행 시간에 대신 수행해야합니다. 내가 방문자 패턴으로의로 좋아 아니에요 (이 사건에 적절하지 않을 수 있습니다 double dispatch를 에뮬레이션하는 방법

  • 사용 visitor pattern을 찾아 실행

    • 사용 반사 :

      옵션 많은 사람들이 자동으로 주조 작업을 수행하기위한 섬세한 트릭이나 폴더의 유틸리티가 있어야합니다 것처럼

  • 0

    난 정말 기분이)입니다.

    나는 당신을 찾을 수있을 것 같지 않습니다.

    많은 수의 유형 (20 개 이상)이있는 경우 value.getClass()에서 해시 테이블 조회를 수행하여 일부 '설정자'개체의 인스턴스를 제공하는 것이 좋습니다. 그러나 많은 보편적 인 코드를 작성해야합니다 ... 그래서 우아한 IMO로 간주되지 않습니다.

    반사도 옵션이지만 비싸고 잠재적 인 런타임 오류 모드가 발생할 수 있습니다. 게다가, 나는이 특별한 경우에 그것이 어떻게 많이 도움이 될지 실제로 알지 못한다.