2013-04-26 62 views
-1

我有一些牛仔代碼,需要一點點改進。我想提高文檔化日誌記錄的效率,而不會感到巨大的硬編碼開關語句的恥辱。如何從Java界面值獲取字段名稱?

在下面的代碼中,我希望能夠調用一個實用程序,將它傳遞給一個接口和一個值,並讓它返回初始化爲該值的字段的名稱。所以,如果一個接口有public static int ONE = 1,那麼(T,1)的返回值應該是「ONE」。就像這樣:

public interface SOBConstants 
{ 
    public static final int EVENT_WILLIE  = 0; 
    public static final int EVENT_LOPEZ  = 1; 
    public static final int EVENT_GETS_HIS = 2; 
    public static final int EVENT_DUE   = 3; 
} 

public class Mordecai implements SOBConstants 
{ 
    public void handleEvent(int eventid) 
    { 
     // Existing log entry: 
     log.debug("Handling event" + id); 

     // New log entry: 
     log.debug("Handling event " + Utils.eventName(SOBConstants, eventid); 
     // Should output "Handling event EVENT_WILLIE", etc. 

     switch(eventid) 
     { 
      case EVENT_WILLIE : 
       super.attachVictim(); 
       break; 
      case EVENT_LOPEZ : 
       super.confirmVictim(); 
       break; 
      case EVENT_GETS_HIS : 
       super.openStreetFader(); 
       break; 
      case EVENT_DUE : 
       super.animateDescent(); 
       super.playOutro(); 
       break; 
      default : 
       super.detachAndContinueSearch(); 
     } 
     return; 
    } 
} 

public class Utils 
{ 
    public static String eventName(Object container, int eventID) 
    { 
     String s = ""; 

     if(container != null) 
     { 
      Field[] flist = container.getClass().getDeclaredFields(); 
      for (Field f : flist) 
       if(f.getType() == int.class) 
        try { 
         if(f.getInt(null) == eventID) { 
          s = f.getName(); 
          break; 
         } 
        } catch (IllegalArgumentException e) { 
        } catch (IllegalAccessException e) { 
        } 
     } 
     return s; 
    } 
} 

我怎麼能寫(或電話)Utils.eventName允許任何接口傳遞並掃描其值也傳遞的域名?我想專注於接口而不是傳遞實現類,因爲這需要添加一些額外的鑑別器。目前,該字段列表是空的。

或者,這是正常的,是和我只需要調用像

Utils.getName(new SOBConstants(){}, 3); 

另外請注意:我考慮過用實際的枚舉,但是這似乎是一個確定的時間/精力臨時改善(也有100的常量)。所以不要建議枚舉。不相關。

謝謝! HS

+4

使用枚舉將是一個*多*更好的主意。將值轉換爲字符串表示法更容易,*和*您可以確保正確的事件類型僅用於正確的事件處理程序。我會去那個解決方案。 – 2013-04-26 16:11:33

+0

@Jon - 我完全同意,除非在時間段內有太多的代碼需要觸及,我必須進行這種漸進式改進。 – user1944491 2013-04-26 16:17:44

回答

1

使用枚舉。

public enum SOBConstants 
{ 
    EVENT_WILLIE (0), 
    EVENT_LOPEZ (1), 
    EVENT_GETS_HIS (2), 
    EVENT_DUE (3); 

    private int value; 
    private SOBConstants(int value) { this.value = value; } 

    public int getValue() { 
    return value; 
    } 

    public MyReturnType doSomething(Object arg) { 
    // do new functionality 
    } 
} 

然後,您可以添加任何您想要枚舉的方法來獲取所需的任何相關功能。

+0

Jeez,雖然,很好,謝謝,恩,我已經說過 - 現在3次 - 枚舉不是解決方案。該任務是讀取/解析現有接口,而不是正確地重寫它。 – user1944491 2013-04-26 16:23:48

+1

我花了一分鐘將班改爲班。它沒有你想象的那麼長,使得枚舉非常簡單。它將花費更多的時間來編寫解決方法,以便正確地執行此操作。 – durron597 2013-04-26 16:25:13

+0

好吧,好吧,就像我說的,「謝謝」,但這是回答你的問題,而不是我的問題。我想要的答案是「如何傳遞和解析接口」,而不是如何通過重新設計來避免這樣做。 – user1944491 2013-04-26 16:30:19

相關問題