我有一些牛仔代码,需要一点点改进。我想提高文档化日志记录的效率,而不会感到巨大的硬编码开关语句的耻辱。如何从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
使用枚举将是一个*多*更好的主意。将值转换为字符串表示法更容易,*和*您可以确保正确的事件类型仅用于正确的事件处理程序。我会去那个解决方案。 – 2013-04-26 16:11:33
@Jon - 我完全同意,除非在时间段内有太多的代码需要触及,我必须进行这种渐进式改进。 – user1944491 2013-04-26 16:17:44