我有一些牛仔代碼,需要一點點改進。我想提高文檔化日誌記錄的效率,而不會感到巨大的硬編碼開關語句的恥辱。如何從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