2013-04-26 56 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

相关问题