2013-06-17 35 views
5

Lớp ứng dụng/Chế độ xem của tôi có hệ thống điều phối sự kiện còn gọi là bảng đen. Trong đó người nghe được lưu trữ bởi một hashmap với các phím là các loại sự kiện được triển khai như một EventType enum và các giá trị là các tham chiếu listener lắng nghe kiểu sự kiện này. Ví dụ. một đối tượng mô hình đang nghe loại sự kiện "LOCAL_PLAYER_INPUT", quy trình bảng đen và thông báo cho trình phát vì trình phát triển khai giao diện EventHandler.Xử lý sự kiện được đóng gói với Enums

Tôi muốn tách riêng mô hình của mình bằng cách triển khai bảng đen độc lập cho mô hình. Sau đó nó sẽ được thêm vào như một người nghe đến bảng lớp ứng dụng kể từ khi lớp ứng dụng nhận được I/O từ bàn phím hoặc chạm. Mô hình bảng đen sẽ tự đại diện các sự kiện hơn nữa sau đó. Đối với điều này tôi muốn tạo ra một hệ thống phân cấp enum nơi sự kiện được phân loại theo cách này:

MODEL.LOCAL.PLAYER_INPUT 

Mẫu sẽ được đăng ký là người biết lắng nghe theo quan điểm đen chỉ bằng cách đi qua MODEL như thế này:

addListener(model.blackboard, MODEL); //Types: (EventHandler, EventType) 

Bằng kết hợp các giao diện với enums tôi đã đạt được, rằng tôi có thể viết eventtypes như MODEL.XY nhưng nó sẽ không được chấp nhận bởi addListener mặc dù MODEL đang triển khai giao diện EventType.

Tôi nên làm gì?

EDIT: Một số mã khác

addListener Phương pháp:

public void addListener(EventHandler handler, EventType eventType) { 
    getListener(eventType).add(handler);} 


private Array<EventHandler> getListener(EventType eventType) { 
    if(map.containsKey(eventType)) 
     return map.get(eventType); 
    else { 
     Array<EventHandler> tmp = new Array<EventHandler>(false, 1, EventHandler.class); 
     map.put(eventType, tmp); 
     return tmp; 
    } 

} 

Enums:

public interface WL extends EventType { 

public static enum LOCAL { 
    PLAYER_INPUT, 
    NPC_INPUT 
} 

}

GameEvent:

public GameEvent(EventType eventType, Object message) { 
    this.eventType = eventType; 
    this.message = message; 
    timeStamp = System.currentTimeMillis(); 

} 
+0

Vì khóa của bạn là enums, bạn nên cân nhắc sử dụng 'EnumMap'. Mặc dù tôi tin rằng đây không phải là hiệu suất thực sự quan trọng ở đây – fge

+0

Đó là một mẹo hay, tôi sẽ thực hiện nó, cảm ơn! –

+0

Một số mã khác sẽ hữu ích. Làm thế nào để enum của bạn (s) trông giống như, trình biên dịch phàn nàn về những gì? – lost

Trả lời

0

MODEL.LOCAL.PLAYER_INPUT không thuộc loại EventType mặc dù MODEL là. Vì enum là một lớp bên trong của MODEL, loại của nó là acctually LOCAL.

public interface WL extends EventType { // Your interface WL is EventType 

    public static enum LOCAL { // Your enum is type LOCAL because there are no extensions 
     PLAYER_INPUT, 
     NPC_INPUT // Your enum constants represents something of type LOCAL 
    } 
} 

Bạn có thể thay đổi nó thành:

public enum WL implements EventType { // Your interface WL is EventType 

    public static enum LOCAL implements EventType { // LOCAL is now EventType 
     PLAYER_INPUT, 
     NPC_INPUT // So are the enum constants 
    } 
} 

Vấn đề là, nếu bây giờ bạn tham khảo WL.LOCAL, đó là loại sẽ Class (không chắc chắn 100% về điều đó nhưng nó deffinetly không EventType. Thậm chí không thể biên dịch acctually). Bạn sẽ phải khai báo LOCAL dưới dạng hằng số enum để truy cập theo cách đó. Đáng buồn là không có cách nào để làm điều này nếu cả hai nên có cùng tên.

Nếu tôi không bỏ lỡ thứ gì đó, bạn phải tìm một giải pháp hoàn toàn khác. Có thể không phải là câu trả lời bạn đang tìm kiếm nhưng quá dài để đưa vào nhận xét.

+0

Cảm ơn câu trả lời của bạn. Tôi sẽ làm theo cách này ngay bây giờ: Vì enum WL (đây là viết tắt của WorldLogic, đó là tên cho mô hình của tôi) là Loại WL Tôi có thể thực hiện kiểm tra getClass() và mọi thứ đều ổn. Thêm một phương thức addListener quá tải vào bảng đen của tôi, nó bổ sung thêm các trình nghe tìm kiếm một lớp đặc biệt và đó là nó. –

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