2013-03-23 3 views
-1

나는 Location 클래스가 필요합니다. Player 클래스가 있습니다. 각 위치 클래스는 Location으로 확장되며 정적 인스턴스를 반환하는 메서드가 있습니다.하위 클래스의 정적 데이터 가져 오기

문자에 추가 기능 클래스의 이름을 나타내는 문자열이있는 경우 어떻게 인스턴스를 가져올 수 있습니까?

문자 :

public class Player { 
    public static Location getLocation() { 
     try { 
      //return location 
     } catch (Exception ex) { 
      Logger.getLogger(Player.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null; 
    } 
} 

위치 :

public class Location{ 
    protected static Location singleton; 
    public static Location get() { 
     return null; 
    } 

위치 클래스 :

public class Finleydale extends Location{ 
    public static Location get() { 
     if (Finleydale.singleton == null) { 
      Finleydale.singleton = new Finleydale(); 
     } 
     return singleton; 
    } 
} 

내가 여러 위치 정보를 가지고 있고, 내가 그렇게 모든 위치 클래스의 싱글이 추가 위치 정보가 있습니다. 위치의 버전이 하나뿐이기 때문에 싱글 톤은 정적입니다. 누군가 나를 도와 줄 수 있습니까?

+0

안녕하세요. @HovercraftFullOfEels에 감사드립니다. – Perception

+0

@Perception : :) y/w! –

+0

미안하지만, 나는 게시에 익숙하지 않다. – JohnAMeyer

답변

0

나는 get() 함수의 정적 수정자를 제거하고 그림과 같이 Player 클래스를 변경했습니다.
다른 모든 사람들, 당신의 의견은 훌륭했습니다.

String locationS; //Class name 
    public static Location getLocation() { 
     return ((Location) Class.forName(locationS).newInstance()).get(); 
    } 
0

기본 클래스에서 정적 필드를 선언 한 방법은 전체 프로그램에서 참조가 하나만 있음을 의미합니다. 하나 이상의 하위 클래스가 있고 각 하위 클래스에 할당 된 경우 Location 기본 클래스에있는 (정적) 필드와 각각 동일한 (정적) 필드가 할당됩니다. 각 하위 클래스마다 별도의 싱글 톤을 원한다고 생각합니다.

키 (문자열 값)로 특정 위치를 검색하려는 경우, 싱글 톤 패턴이 사용자가 찾고있는 패턴이라고 생각하지 않습니다. 로,

  • 당신은 여전히 ​​레지스트리
  • 에게 고전 싱글 톤 패턴을 채우기 위해 싱글 톤 패턴을 사용할 수 있습니다

    public class LocationRegistry 
        { 
        private static final Map<String, Location> registry; 
        static 
         { 
         final Map<String, Location> _registry = new HashMap<>(); 
         _registry.put("Finleydale", new Finleydale()); 
         // ... 
         registry = Collections.unmodifiablemap(_registry); 
         } 
    
        public static Location getLocation(final String id) 
         { 
         return registry.get(id); 
         } 
        } 
    

    일부 노트 : 나는 이런 걸는 "위치 레지스트리"클래스를 만들 것 귀하의 질문에 시연, 스레드로부터 안전하지 않습니다. 불필요한 락을 가지지 않는 thread-safe 버전은 매우 까다 롭지 만 불가능하지는 않습니다. static final 필드는 문제를 잘 해결합니다.

  • 레지스트리에 명시 적으로 각 Location 하위 클래스를 참조 할 필요는 없습니다. 각 위치 등록 자체를 가질 수 있습니다. 유일한 트릭은 위치를로드하여 스스로 등록 할 수있는 메커니즘을 갖는 것입니다.
  • 실제로이 용도에 서브 클래스가 적절합니까? 서로 다른 위치가 다른 행동을 했습니까, 아니면 다른 데이터 (예 : 이름)를 가지고 있습니까? 후자의 경우 위의 정적 초기화 도구와 같은 단일 위치 클래스 및 단일 팩터 리만 사용하여 각 위치를 만듭니다.
+0

좋은 생각, 이상 생각합니다. 내가 어떻게 생각하는지 말해줘. – JohnAMeyer

0

개체 모델에 관한 문제가 잘못되었습니다. 왜 에 getLocation() 메서드가있는 인터페이스가 없으며 인터페이스 구현자는 해당 위치를 반환 할 수 있습니다. 싱글 톤 Location은 개념적으로 잘못된 것 같습니다.

interface Locatable { 
    Location getLocation(); 
} 

class FinleyLand implements Locatable { 
    @Override 
    Location getLocation() { 
     //whatever it takes to get you there... 
    }  
} 
+0

위치 클래스에는 다른 메서드가 있습니다. 직접 관련이 없으므로 생략했습니다. – JohnAMeyer

+0

OK - 인터페이스로 추출하십시오. 인터페이스에 대해 프로그래밍하지 않으면 객체 모델이 더 취약 해지는 경향이 있습니다. –

+0

"반대 인터페이스"란 무엇을 의미합니까 – JohnAMeyer

관련 문제