2011-08-06 28 views
5

Tôi hiện đang làm việc trên một dự án mà chúng tôi phải đại diện cho một tập hợp các vectơ trong một môi trường 3D. Chúng tôi có một số triển khai trực quan hóa khác nhau.Sử dụng enums như một container triển khai

Tôi đã nảy ra ý tưởng, rằng tôi có thể gộp tất cả các loại hình ảnh hóa trong một môi trường. Tôi đã xác định Giao diện VectorVisualization và một số triển khai thực hiện giao diện này.

Bây giờ tôi đã thêm vào lớp Interface enum sau:

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); 
} 

Nhãn là một JComboBox trong Gui. Vì vậy, tôi bây giờ có thể chỉ lặp qua enum và nhận được nhãn của các loại khác nhau. Ngoài ra để cài đặt Triển khai, tôi có thể sử dụng enum như thế:

VectorVisualizationType.CYLINDER.getVisualization() 

Nhưng đây có phải là cách hay không? Hoặc có bất kỳ vấn đề với cách tiếp cận đó? Tất nhiên, bây giờ khi bạn đã tạo một triển khai mới, bạn phải thêm điều này vào enum.

Cảm ơn ý kiến ​​của bạn!

Trả lời

1

Thú vị. Tôi đã sử dụng các kiểu liệt kê để mang theo các bit siêu dữ liệu hữu ích trước đây, nhưng không bao giờ lấy nó khá xa để lưu trữ các đoạn mã thực thi.

Điều đó nói rằng, vấn đề duy nhất tôi thấy với cách tiếp cận của bạn là, như bạn đã lưu ý, khi bạn tạo một triển khai VectorVisualization mới, bạn sẽ phải thêm thủ công một mục nhập mới vào điều tra. Nói chung tôi thích tránh chi phí thủ công như vậy nếu có thể, nhưng thực sự đó là vấn đề sở thích cá nhân.

Nếu bạn (và tất cả những người khác làm việc trên mã này với bạn) nhận thức được ràng buộc này và đừng bận tâm, thì tôi nghĩ giải pháp của bạn là tốt. Lưu ý rằng cấu trúc hiện tại của bạn yêu cầu mỗi VectorVisualization phải được thực hiện theo cách an toàn theo chủ đề, bởi vì chỉ có một cá thể được trao cho tất cả những người tham khảo nó thông qua loại được liệt kê. Nếu đây là vấn đề bạn có thể làm việc xung quanh nó bằng cách lưu trữ các lớp thực thi chống lại việc liệt kê thay vì các cá thể thực hiện, và sau đó chỉ cần sửa đổi getVisualization() để tạo một cá thể mới của lớp triển khai liên kết khi nó được gọi. Điều này sẽ đặt ra một hạn chế bổ sung đối với việc triển khai VectorVisualization, mà mỗi cái cần phải cung cấp một hàm tạo 0 tham số công khai để tạo ra một thể hiện có thể sử dụng được.

+0

Cảm ơn câu trả lời của bạn! Đó là một điểm tốt với Thread-Safety. Nhưng trong trường hợp của chúng tôi nó không phải là một vấn đề. Một cách khác để cung cấp chức năng tương tự sẽ là sử dụng bản đồ nơi bạn sẽ sử dụng enum làm khóa và VectorVisualization làm giá trị. Nhưng khi thêm một triển khai mới, bạn phải xác định rằng tại hai vị trí mã thay vì một với enum .. Vì vậy, tôi vẫn còn ở bên enum :). – Prine

+0

@Prine - Vâng, tôi đã sử dụng cách tiếp cận dựa trên bản đồ nhiều lần trong quá khứ, nhưng nó không mang lại lợi ích cho những gì bạn đã thực hiện với enum (ngoại lệ có thể xảy ra: bạn có thể thêm các mục mới vào bản đồ động trong thời gian chạy, và/hoặc loại bỏ những cái hiện có), vì vậy tôi đã không mang nó lên. Lần sau tôi cần nó, tôi có thể thử ý tưởng dựa trên enum của bạn để thay thế. – aroth

1

Sử dụng một liệt kê để liệt kê các hiện thực hiện có một số thuộc tính rất đẹp. Ví dụ. nó là khá dễ dàng để tìm thấy tất cả các hiện thực hiện như họ theo định nghĩa phải được liệt kê trong kê khai liệt kê và bạn có giao diện enum tiêu chuẩn để có được quyền truy cập vào việc triển khai.

Nhưng nó cũng làm cho nó không thể mở rộng tập hiện tại theo cách có thể cắm được - do đó, bên thứ ba không thể thêm triển khai mới. Vì lý do này, tôi thường thích sử dụng một người quản lý đơn lẻ sẽ giữ tất cả các triển khai. Mẫu này cũng chơi rất độc đáo với nhiều khung công tác thành phần như OSGi.

Các vấn đề liên quan