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!
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
@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