자바 리플렉션을 과도하게 사용하고 있는지 궁금합니다.
두 개의지도에 대한 데이터 보유자 인 클래스가 있습니다. 입력으로 키를 제공하는 공개 get (...) 메소드를 사용하여 해당 맵에 연관된 값을 리턴합니다.
지도가 크기 때문에 실제로 액세스하려는 경우에만지도를로드합니다. 그래서 모든 get (...) 메소드에서 맵이 null인지 확인합니다. 일치하는 경우 해당하는 loadMap (..) 메서드를 호출합니다.
다음은 샘플 코드는 문제는 내가 여러지도를 가지고있다자바 : 반사 과용?
public getId(String name)
{
try
{
if(nameMap1 == null)
loadNameMap1();
} catch(...) {....}
return nameMap1.getId(name);
}
스 니펫입니다. 그래서 각 맵을로드하기 위해 getMap (..) 메소드와 get (...) 메소드에서 try catch 블록을 가지고있다. 그래서 대신에 리플렉션을 사용하여 적절한 메소드를 호출하고 모든 예외를 처리하는 loadMap (Object map, String methodName)이라는 메소드를 작성했습니다.
private synchronized void loadMap(Object map, String methodName)
{
if (map == null)
try
{
Method method = this.getClass().getDeclaredMethod(methodName, new Class[0]);
method.invoke(this, new Object[0]);
}
catch (..)
}
여기 반사를 과용합니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? (사이드 노트 : 나는 여러 클래스로 클래스를 리팩토링 할 수 없음)이 Effective Java by Joshua Bloch
에 작성된 "반사의 사용이 제한"으로 자격이 있습니까 내가 생각
"클래스를 여러 클래스로 리팩터링 할 수 없습니다." 왜 그런데? 현재 인터페이스를 외부에 유지할 수 있지만 구현은 일부 MapLoader 인터페이스를 사용하여 리팩터링 될 수 있습니다. – Thilo
@Thilo : 디자인을 제어 할 권한이 없습니다. – athena
디자인에 대한 통제권이 없다면 어떻게 리플렉션을 사용하기로 결정할 수 있습니까? 확실히 사내 내부 클래스 (구현 세부 정보)를 추가하면 사물 디자인과 충돌하지 않습니다. – Thilo