【问题标题】:Get all static variables of a class without reflection获取一个类的所有静态变量而不进行反射
【发布时间】:2015-04-15 12:34:33
【问题描述】:

我们有一个异常 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;
   }
}

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

【问题讨论】:

  • 此问题可能重复:stackoverflow.com/questions/4466743/…
  • @cyber_rookie 虽然有人使用反射:P
  • 我不会将其称为重复项,因为 OP 知道将反射作为解决方案。他要另一个
  • 没有反射是不可能的。
  • 在 SO 上有很多人对重复项感到很痒。是否有比赛可以成为第一个发布它的人?

标签: java


【解决方案1】:

也许你可以通过一个界面:

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() 一样简单。

【讨论】:

  • 该界面实际上并不是您的解决方案的一部分...您没有将它用于任何事情...
  • 所以?你可以在没有界面的情况下做到这一点。
  • @immibis 如果错误文本在 Java 标识符中包含任何无效内容,则不会
  • @fge 感谢您的建议。您是否建议将 ExcpetionA 类更改为枚举?如果是这样我不能,因为类 ExceptionA 用于在我们的代码中实例化。
  • @fge 那么为什么需要这个接口呢?移除public interface FaultCodeProvider {...},移除implements FaultCodeProvider,移除@Override
【解决方案2】:

我修改了如下代码:

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”,我可以从其他类访问故障代码列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多