2011-08-06 5 views
5

현재 3D 환경에서 일련의 벡터를 표현해야하는 프로젝트를 진행 중입니다. 여러 가지 시각화 구현이 있습니다.enum을 구현 컨테이너로 사용하기

모든 시각화 유형을 열거 형으로 묶을 수 있다는 생각에 왔습니다. 인터페이스 VectorVisualization 및이 인터페이스를 구현하는 여러 구현을 정의했습니다.

는 지금은 인터페이스 클래스에 다음 열거를 추가했습니다 :

public interface VectorVisualization { 

    public enum VectorVisualizationType { 
     CYLINDER(new VectorVisualizationCylinder(), "Cylinder"), 
     CONES(new VectorVisualizationCones(), "Cones"), 
     FATCONES(new VectorVisualizationFatCones(), "Fat cones"), 
     ARROWS(new VectorVisualizationArrows(), "Arrows"); 

     private final String label; 
     private final VectorVisualization vis; 

     VectorVisualizationType(VectorVisualization vis, String label) { 
      this.vis = vis; 
      this.label = label; 
     } 

     public VectorVisualization getVisualization() { 
      return this.vis; 
     } 

     public String getLabel() { 
      return this.label; 
     } 
    } 

    void prepareVBO(GL gl, ArrayList<VectorData> vectors, VectorField field); 
    void render(GL gl); 
    void clearOldVBOS(GL gl); 
} 

라벨이 GUI에서 JComboBox를위한 것입니다. 이제 열거 형을 반복하고 다른 유형의 레이블을 얻을 수 있습니다. 또한 구현을 설정하려면 다음과 같은 열거 형을 사용할 수 있습니다.

VectorVisualizationType.CYLINDER.getVisualization() 

좋은 방법입니까? 아니면 그 접근법에 문제가 있습니까? 물론 새로운 구현물을 만들었 으면 이것을 enum에 추가해야합니다.

의견을 보내 주셔서 감사합니다.

답변

1

흥미 롭습니다. 유용한 유형의 메타 데이터를 전달하기 위해 열거 형을 사용했지만 실행 가능한 코드를 저장하는 데까지 사용 된 적이 없습니다.

그렇습니다. 내가 알기로, 새로운 VectorVisualization 구현을 만들 때 직접 열거에 새 항목을 추가해야 할 것입니다. 일반적으로 필자는 가능한 경우 수동으로 오버 헤드를 피하는 것을 선호하지만 실제로는 개인 취향의 문제입니다.

여러분 (그리고이 코드를 사용하는 다른 모든 사람들)이이 제약 조건을 인식하고 있어도 괜찮다면 솔루션이 괜찮다고 생각합니다.

열거 형을 통해 참조하는 모든 사용자에게 전달되는 인스턴스가 하나뿐이기 때문에 현재 구조에서는 VectorVisualization을 스레드로부터 안전한 방식으로 구현해야합니다. 이것이 문제가되는 경우 구현 인스턴스 대신 열거에 대해 구현 클래스를 저장 한 다음 getVisualization()을 수정하여 호출 될 때 연관된 구현 클래스의 새 인스턴스를 만들면됩니다. 이렇게하면 VectorVisualization 구현에 대해 추가 제한이 있으며, 각 구현은 사용 가능한 구현 인스턴스를 생성하는 public 0 매개 변수 생성자를 제공해야합니다.

+0

답변 해 주셔서 감사합니다. Thread-Safety의 좋은 점입니다. 그러나 우리의 경우에는 문제가되어서는 안됩니다. 유사한 기능을 제공하는 또 다른 방법은 enum을 키로 사용하고 VectorVisualization을 값으로 사용하는지도를 사용하는 것입니다. 하지만 새로운 구현체를 추가 할 때 enum과 함께 두 개의 코드 위치에서 정의해야합니다. 그래서 열거 형 사이드에 있습니다. :) – Prine

+0

@Prine - 네, 과거에지도 기반 접근 방식을 여러 번 사용해 왔지만 enum으로 수행 한 작업에 비해 이점이 없습니다 (가능한 예외 : 런타임에 동적으로 맵에 새 항목을 추가 할 수 있고, 및/또는 기존 것들을 제거), 그래서 그것을 제기하지 않았다. 다음 번에 내가 필요로 할 때, 당신의 enum 기반 아이디어를 대신 사용해 볼 수 있습니다. – aroth

1

현재 구현을 나열하는 열거 형을 사용하면 여러 가지 훌륭한 속성이 있습니다. 예 : 열거 선언에 정의가 있어야하고 구현에 액세스 할 수있는 표준 enum 인터페이스가 있어야하므로 모든 현재 구현을 쉽게 찾을 수 있습니다.

그러나 현재 설정을 플러그 방식으로 확장 할 수 없으므로 타사에서 새 구현을 추가 할 수 없습니다. 이 때문에 모든 구현을 보유 할 싱글 톤 관리자를 사용하고 싶습니다. 이 패턴은 또한 OSGi와 같은 많은 구성 요소 프레임 워크에서 매우 잘 작동합니다.

관련 문제