2017-09-14 36 views
0

我對Java仍然比較陌生,並試圖實現最佳實踐。我有一堂課我想重蹈覆轍。我四處搜尋,找不到任何能解決我的問題的東西。使用枚舉來處理整型事件類型

我有一個名爲Definitions的類,它將所有事件名稱映射到它們各自的事件ID。我有另一個課程來解析名爲EventHandler的事件。 EventHandler有一個switch語句,它已經變得非常大。我想減小處理程序方法的大小,以便代碼更易於閱讀。

我從下面截取了約50個其他事件。在每種情況下,大約有20-30行代碼。你可以想象這個switch語句有多大。

Definitions類:

public class Definitions 
{ 
    public static class EVENT 
    { 
     public static final int SEQUENCE_START = 10; 
     public static final int SEQUENCE_HALT = 11; 
     public static final int SEQUENCE_AUTHORIZED = 12; 
    } 
} 

EventHandler類:

public handledStack parse(IRPEventType buffer) 
{ 
    final int eventId = Integer.parseInt(buffer.reader().parse("EventID")); 


    switch (eventId) 
    { 
     case Definitions.EVENT.SEQUENCE_START: 
     { 
      // stuff happens here 
      break; 
     } 

     case Definitions.EVENT.SEQUENCE_HALT: 
     { 
      // stuff happens here 
      break; 
     } 
     case Definitions.EVENT.SEQUENCE_AUTHORIZED: 
     { 
      // stuff happens here 
      break; 
     } 
    } 
} 

回答

2

我會用枚舉喜歡stategy模式實現。退房Strategy pattern using Enums. Need a simple example in Java

interface Strategy { 
    void execute(Object param); 
} 

enum EVENT implements Strategy { 
    SEQUENCE_START(10) { 
     @Override 
     public void execute(Object param) { 
      // stuff happens here 
     } 
    }, 
    SEQUENCE_HALT(11) { 
     @Override 
     public void execute(Object param) { 
      // stuff happens here 
     } 
    }, 
    SEQUENCE_AUTHORIZED(12) { 
     @Override 
     public void execute (Object param){ 
      // stuff happens here 
     } 
    }; 

    private final int id; 

    EVENT(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 
} 

public class Test { 

    public void handledStack parse(IRPEventType buffer) { 
     final int eventId =  Integer.parseInt(buffer.reader().parse("EventID")); 
     for (EVENT event : EVENT.values()) { 
      if (event.getId() == eventId) { 
       event.execute(param); 
       break; 
      } 
     } 
    } 
} 
+0

不幸的是,EventId不會等於序號。有沒有辦法處理分散的事件ID值? – user0000001

+0

我剛剛編輯了代碼,以便它能與事件ID一起使用。 –