7

Tôi có một enum của TriggerType, nơi trigger khác nhau có thể được thêm vàoLàm thế nào để tránh báo cáo chuyển đổi hợp cụ thể trong Java

public enum TriggerType { 
    meta,data,list,toggle 
} 

Những loại kích hoạt được sử dụng bên trong bộ xử lý khác nhau (ví dụ như Component, Dashboard vv) để xác định kích hoạt được kích hoạt bên trong xử lý thông qua một switch hợp cụ thể, đối với đoạn mã ví dụ Mã của ComponentHandler sử dụng kích hoạt thông qua công tắc hợp cụ thể được đưa ra dưới đây

@Override 
public TriggerResultInterface executeTriggerJob(TriggerEventHelper triggerEventHelper) throws TriggerHandlerException { 
    switch (triggerEventHelper.getTriggerName()) { 
     case meta: 
      return getMetaComponentConfig(triggerEventHelper); 
     case data: 
      return getComponentData(triggerEventHelper); 
     default: 
      LOGGER.debug(INVALID_TRIGGER_NAME_CONFIGURED); 
      throw new TriggerHandlerException(INVALID_TRIGGER_NAME_CONFIGURED); 
    } 

} 

Imagine Nếu tôi muốn thêm một trigger mới, tôi phải cập nhật các enum lớp học không thể tránh khỏi, đồng thời tôi có để cập nhật từng lớp xử lý của tôi mà Trigger cần được sử dụng, Đây có phải là cách thiết kế có mã hóa hay không hoặc có giải pháp nào khác tốt hơn để tăng cường mã này và tuân theo nguyên tắc RẮN cùng với thiết kế tốt hơn không.

Tôi muốn nhấn mạnh rằng câu hỏi này không trùng lặp với this. Chỉ có một hành vi cần thiết trong tình huống đó cho mỗi loại (ví dụ: convertToMp3). Nhưng câu hỏi của tôi là loại enum của tôi (Trigger Type) phụ thuộc vào Handler mà nó có thể được sử dụng, vì vậy mỗi hành vi của Trigger Type enum hoặc việc thực hiện sẽ phụ thuộc vào yêu cầu của trình xử lý đang được sử dụng.

+0

Mẫu lệnh có thể phù hợp với trường hợp sử dụng của bạn, nhưng như tôi đã thấy nó được triển khai, vẫn còn một câu lệnh 'switch' để tìm ra lệnh cần gọi. –

+1

Đặt (các) phương thức trong Enum, với ghi đè cho mỗi giá trị. Tôi thấy trong thực tế có giá trị giới hạn khi thực hiện điều này, vì bạn phải cung cấp nhiều loại ngữ cảnh bên ngoài cho mỗi phương pháp phá hủy khả năng của Enum để đứng một mình, nhưng nếu bạn có thể hạn chế thiệt hại đó thì đó có thể là một kỹ thuật hữu ích. – EJP

+2

[Câu trả lời tôi đã viết] (http://stackoverflow.com/a/39045135/2398375) cho bạn về các trình xử lý ngữ cảnh trước đó ngày hôm nay, đó là cách bạn muốn làm điều đó –

Trả lời

3

Một trong những giải pháp là sử dụng đa hình để xử lý các trình kích hoạt khác nhau. Ví dụ: bạn có thể khai báo giao diện Trigger và có một số triển khai. Trong trường hợp này, khi bạn cần một loại kích hoạt mới, bạn chỉ cần thực hiện giao diện này và không chạm vào mã hiện tại:

public interface Trigger { 
    TriggerResultInterface execute(TriggerEventHelper eventHelper); 
} 

public class MetaTrigger implements Trigger { 
    @Override 
    TriggerResultInterface execute(TriggerEventHelper eventHelper) { 
     // do meta trigger work here 
    } 
} 

public class DataTrigger implements Trigger { 
    @Override 
    TriggerResultInterface execute(TriggerEventHelper eventHelper) { 
     // do data trigger work here 
    } 
} 

// ... 

public TriggerResultInterface executeTriggerJob(TriggerEventHelper eventHelper) { 
    eventHelper.getTrigger().execute(eventHelper); 
} 

trong trường hợp này nó sẽ không thể để thêm một loại kích hoạt mới và không thực hiện nó hành vi.

Nếu bạn cần triển khai mặc định, bạn có thể sử dụng lớp cơ sở thay vì giao diện (trong Java 8 bạn có thể thêm quyền triển khai mặc định vào giao diện).

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