用于宏的Java中#define的等价物

时间:2011-06-08 16:40:59

标签: java preprocessor c-preprocessor

我的问题接近this one,但不完全相同。

我的类中有一个继承的(因为,我不能/不会改变它)参数数组,如下所示:

public double[] params;

该类以复杂的方式使用这些参数,因此我更希望为数组中的每个元素提供可读的名称。在C中,你会做这样的事情

#define MY_READABLE_PARAMETER params[0]

我也知道在Java中我可以创建一堆常量或带有属性的枚举器。然后,要访问参数,我必须键入以下内容:

params[MY_READABLE_PARAMETER]

这是可以接受的,但我真的想省略数组名称。有可能吗?

4 个答案:

答案 0 :(得分:3)

是的,只需不使用数组即可:

double myReadableParameter;
double anotherReadableParameter;

如果您需要将它们作为集合访问,您可以随时将它们放在列表中。

答案 1 :(得分:3)

你有什么理由不能这样做吗?

...
public double getMyReadableParam() {
    return params[0];
}

public void setMyReadableParam(double value) {
    params[0] = value;
}
...

答案 2 :(得分:3)

使用Enum

enum Param {
    AGE(0);
    WEIGHT(1);
    ...

    private int arrayIndex;
    // Constructor
    Param(int index) {
        arrayIndex = index;
    }

    public double getValue(double[] params) {
        return params[arrayIndex];
    }
}

你可以这样使用

double age = Param.AGE.getValue(params);

我认为这不比其他建议好,但我想展示如何使用ENUM

答案 3 :(得分:1)

如果你有一个双精度数组,并且特定位置的每个数组元素都有明确的含义,你应该创建一个类。

public class MyParamBlob extends ParentParamBlob
{
    private double myReadableParameter;
    private double anotherParameter;
    private double yetOneMore;

    // getters and setters as appropriate
}

如果您需要处理来自“outside”的现有double[],您可以使用构造函数和/或将数组作为参数的方法。

public class MyParamBlob
{
    ...
    public MyParamBlob(double[] values)
    {
        setAll(values);
    }
    // getters and setters as appropriate
    ...
    public void setAll(double[] values)
    {
        myReadableParameter = values[0];
        anotherParameter = values[1];
        // etc.
    }
}

编辑 - 解释我的评论

如果原始父类(这是double []存在于第一位的原因)具有数组的getter,则可以在此类中重写,在请求时构建并返回数组 - - 例如

public double[] getParams()
{
    double[] params = new double[4];
    params[0] = myReadableParameter;
    params[1] = anotherParameter;
    // etc.
}

如果数组直接可以从父类的实例访问,而没有getter,例如myArray = parentInstance.paramsdouble d2 = parentInstance.params[2]然后(1)这是一个糟糕的设计,(2)来电者可以从您parentInstance.params[1] = 0.0;下面改变数组值