0

基本上我想要一些字典,它是对遗留#define指令的抽象。

我有一个包含 6000 多个定义的旧头文件,这些定义用作标志参数组函数,这些定义表示一种类型的 entity parameter

在 C 我有

  GetParameter(... , T_CTITLE, ...); 

在Java中我想打电话

  Connector.getParameter(Parameter.CTITLE, ...); 

并且 Parameter 将封装与从库中获取参数相关的所有逻辑。

参数实例会自动从标头中提取并转换为 java 代码,但问题是 Parameter 类变得太大 - 即我得到code too large编译错误(让我下划线:有超过 6000 个参数)。

而且我会很高兴以一种使 IDE 能够使用自动完成的方式进行这种抽象,并且非常不喜欢将 Parameter 对象存储在 say 中的想法HashMap

编辑:参数类以下列方式定义:

public Parameter{
    /** logic **/
    public static final Parameter<T> parameter1 = new Parameter<T>("NAME", "T", 0xAAB);
    ...
    public static final Parameter<T> parameter6000 = new Parameter<T>("FOO", "T", 0xZZZ);
}
4

5 回答 5

4

一个明显的技巧是要么分割成一个大的继承链,要么更好地分割成接口(不需要public static final噪音)和一个接口来继承它们。

您可以通过使创建代码更小来节省空间。代替:

new Parameter<T>("NAME", "T", 0xAAB)

一个极简主义的方法是:

parameter("NAME T AAB")

有关限制的详细信息,请参阅JVM Spec (2nd Ed) 的第 4.10 节。要查看编​​译后的代码是什么样的,请使用.javap -c

于 2009-05-14T18:13:06.527 回答
1

也许我不明白你想正确做什么,但这对我来说似乎是 Enum 的完美用途。由于您可以向 Enums 添加函数,因此只要您的 Java 版本足够新(1.5+),它们应该能够做您想做的事情。他们也连载!

是的,它适用于自动完成,尽管 6000 的列表很大。

我不知道枚举的大小是否有限制,但你可以找出来。

前任:

public enum Parameter {
    NAME("Pending", "T", 0xAAB), FOO("Foo", "T", 0x1FC);

    private final String displayValue;
    private final char myChar;
    private final int someNum;

    private Parameter(String display, char c, int num) {
        this.displayValue = display;
        this.myChar = c;
        this.someNum = num;
    }

    public String getDisplayValue() {
        return displayValue;
    }

    public char getMyChar() {
        return myChar;
    }

    public int getSomeNum() {
        return someNum;
    }
}

现在这可以让你做你想做的事情。前任:

System.out.println("Hi, the value is " + Parameter.NAME.getSomeNum());

由于它们在运行时不会更改(毕竟,#DEFINE 不能),因此 ENUM 应该符合要求。

至于纯粹的大小,您可能应该尝试对它们进行轻微分类,并将它们放在几个 Enum 组中。

这使您能够关联元数据(数字)、自动完成、== 等。

于 2009-05-14T18:30:15.067 回答
1

基本上,我认为多接口方法是要走的路。以下是我将如何构建该解决方案;我不知道 Parameter 构造函数的第二个参数是什么意思,所以我忽略了它。

在 .../com/yourcompany/legacydefines/Parameter.java 中:

package com.yourcompany.legacydefines;

public class Parameter<T> {
  private final String name;
  private final T val;

  private Parameter(String name, T val) {
    this.val = val;
    this.name = name;
  }

  public static <T> Parameter<T> newParameter(String name, T val) {
    return new Parameter<T>(name, val);
  }

  // then, standard getters for "name" and "val"
}

在 .../com/yourcompany/legacydefines/Parameters1.java 中:

package com.yourcompany.legacydefines;

import static com.yourcompany.legacydefines.Parameter.newParameter;

interface Parameters1 {
  public static Parameter<String> Parameter0001 = newParameter("ABC", "ABCVAL");
  // ...
  public static Parameter<Integer> Parameter0999 = newParameter("FOO", 0xABCD);
}

在 .../com/yourcompany/legacydefines/Parameters2.java 中:

package com.yourcompany.legacydefines;

import static com.yourcompany.legacydefines.Parameter.newParameter;

interface Parameters2 {
  public static Parameter<String> Parameter1001 = newParameter("DEF", "DEFVAL");
  // ...
  public static Parameter<Integer> Parameter1999 = newParameter("BAR", 0x1002);
}

(等等)

在 .../com/yourcompany/legacydefines/Parameters.java 中:

package com.yourcompany.legacydefines;

interface Parameters extends Parameters1, Parameters2, Parameters3, Parameters4,
                             Parameters5, Parameters6, Parameters7 {}

然后,在您的其他代码中只需使用 Parameters.Parameter4562

于 2009-05-14T20:47:30.493 回答
0

扩展 Tom Hawtin 的帖子,考虑使用 JSON 编码结构。

或者更好的是,与其在 Java 代码中对参数进行硬编码,不如将它们放入 XML 或 JSON 文件(或属性文件)中,这些文件会被吸入您最终生成的任何 JAR 文件中。

于 2009-05-14T18:19:46.137 回答
0

我想这就是你想要的。我猜,'T' 是类型,你想使用泛型,这样用户就不必强制转换 #define 值:

public class Parameter<T> {

    public final static Parameter<String> NAME = new Parameter<String>("hello");
    // .. 5998 more declarations
    public final static Parameter<Integer> FOO = new Parameter<Integer>(0xff0b);


    private T value;
    private Parameter(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }   
}

要访问参数,只需调用:

String value = Parameter.NAME.getValue();

java 常量等于#defines 名称,泛型反映了类型,所以我们只需要将值传递给构造函数。代码完成工作正常:)

于 2009-05-14T18:54:38.347 回答