获取一个类的所有静态变量,不使用反射技术。

4
我们有一个异常类A,其中定义了一些故障码作为public static final,并且在我们的源代码中的许多文件(超过100个)中引用了它。我们想要将所有这些故障码放在类B中进行某些处理。
目前,我们已经在类A中实现了一个名为getFaultCodes()的方法来构建故障码列表并返回相同的内容。这种方法的问题在于,每当引入新的故障码时,都必须在getFaultCode方法中添加它。这是容易出错的,因为用户可能会忘记将新代码添加到该方法中。
将这些故障码移到enum下需要更改源代码中遍布各处的许多文件,因此我们不想这样做。
class ExceptionA  {
   public static final String faultCode1 = "CODE1";
   public static final String faultCode2 = "CODE1";
   public static final String faultCode3 = "CODE1";

   List<String> getFaultCodes(){
         list.add(faultCode1);
         ......
         return list;
   }
}

我们正在考虑使用反射,但我在此论坛发布帖子只是为了检查是否有更好的解决方案。请提供您解决此问题的建议。

可能是这个问题的重复:https://dev59.com/GG855IYBdhLWcg3wNxkM - cyber_rookie
我不会称其为重复,因为原帖作者已经知道使用反射作为解决方案。他询问另一种方法。 - giorashc
为什么不将这个类保持为包装器,并在内部使用枚举? - Mena
我认为没有反射是做不到的 :D 是的,这不是重复,是我的错。 - cyber_rookie
3
在SO上有很多人对于重复问题非常敏感。他们是在争夺第一个发布回答的奖励吗?请问这是怎么回事? - user4229245
显示剩余2条评论
2个回答

6
也许你可以通过一个接口来实现:
public interface FaultCodeProvider
{
    String getFaultCode();
}

然后让你的枚举实现它:
public enum DefaultFaultCodes
    implements FaultCodeProvider
{
    FAULT1("text for fault 1"),
    // etc
    ;

    private final String value;

    DefaultFaultCodes(final String value)
    {
        this.value = value;
    }

    @Override
    public String getFaultCode()
    {
        return value;
    }
}

从枚举中收集它们就像循环遍历枚举的 values() 一样容易。

界面实际上并不是你方案的一部分... 你没有在任何地方使用它... - user253751
那么?你可以在没有接口的情况下完成这个。 - user253751
@immibis 如果故障文本中包含任何Java标识符无效的内容,则不执行。 - fge
@fge 感谢您的建议。您是在建议将 ExceptionA 类更改为枚举吗?如果是这样,我不能这样做,因为 ExceptionA 类在我们的代码中被用来实例化。 - Ashok
@fge,那么你为什么需要这个接口呢?移除 public interface FaultCodeProvider {...},移除 implements FaultCodeProvider,以及移除 @Override - user253751

0

我已经修改了代码,如下所示:

class ExceptionA  {

   public enum codes {
        CODE1("CODE1"),
        CODE2("CODE2"),
        CODE3("CODE3"),

       private String code;

      codes(String code){
          this.code = code;
      }

      public String getCode() {
          return this.code;
      }  
   }
   public static final String faultCode1 = code.CODE1;
   public static final String faultCode2 = code.CODE2;
   public static final String faultCode3 = code.CODE3;

}

为了避免在源代码中更改变量出现“faultCode”,我可以从其他类访问故障代码列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接