Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于Java中的#define for宏_Java_Preprocessor_C Preprocessor - Fatal编程技术网

相当于Java中的#define for宏

相当于Java中的#define for宏,java,preprocessor,c-preprocessor,Java,Preprocessor,C Preprocessor,我的问题很接近,但不完全相同 我的类中有一个继承的(如,我不能/不会更改)参数数组,如下所示: public double[] params; 该类以复杂的方式使用这些参数,因此我更希望数组中的每个元素都有人类可读的名称。在C语言中,你会这样做 #define MY_READABLE_PARAMETER params[0] 我还知道,在Java中,我可以创建一组常量或带有属性的枚举数。然后,要访问参数,我必须键入如下内容: params[MY_READABLE_PARAMETER] 这是可

我的问题很接近,但不完全相同

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

public double[] params;
该类以复杂的方式使用这些参数,因此我更希望数组中的每个元素都有人类可读的名称。在C语言中,你会这样做

#define MY_READABLE_PARAMETER params[0]
我还知道,在Java中,我可以创建一组常量或带有属性的枚举数。然后,要访问参数,我必须键入如下内容:

params[MY_READABLE_PARAMETER]

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

是的,只需不使用阵列即可:

double myReadableParameter;
double anotherReadableParameter;

如果您需要将它们作为集合进行访问,则始终可以将它们放在列表中。

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

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

    // getters and setters as appropriate
}
如果您需要处理来自“外部”的现有
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,则可以在该类中重写该getter,在请求时生成并返回数组——例如


如果数组可以直接从父类的实例访问,而不需要getter,例如
myArray=parentInstance.params
double d2=parentInstance.params[2]
,那么(1)这是一个糟糕的设计,(2)调用方可以从您的
parentInstance.params[1]=0.0下更改数组值

您有什么理由不能这样做吗

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

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

使用
枚举

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

实现它,有很多Java预处理器支持C风格macros@Jochen在这种情况下,这不是有点过分了吗?过分了?这和C预处理器所做的“过度杀戮”是一样的…@Jochen我的意思是我必须安装一个额外的库才能实现这个小小的方便。如果它是必须的,并且我需要一个复杂的宏,那么我想它会很好。我很想这样做,但正如我所说的,数组是继承的。我不能搞乱父类,尤其是在一般情况下,我们不知道有多少参数。好的,我想我的答案仍然适用-你可以在派生类的构造函数中分配可读的参数。@Naurgul如果你不知道自己有多少个参数,你怎么能分配名称?@dark\u charlie,那么我不把参数存储两次吗?@toto父类不知道可以有多少个,但是在派生类中它是指定的。这一切都是为了遗传算法,如果这有帮助的话。因此,父类是抽象的个体,而我自己的类是我正在解决的特定问题的个体。您的第二个解决方案不会导致将数据存储两次吗?一次输入值,一次输入MyParamBlob的字段。我认为存储空间无关紧要。无论如何,任何解决方案都会占用一些内存。但是,拥有两个参数副本的危险在于,当您尝试为其分配新值时,可能会出现较大错误。@Naurgul-no,请注意数组是传入的参数,而不是存储的参数;仅存储其中的值。与toto的评论相关的真正重要的是,数组是否可以在父类中访问,可以通过
public double[]getParams()
或直接通过
parentThing.params[2]
访问,在这种情况下,您可能需要将数组与实例成员同步。但是对于
getParams()
您可以在请求时构建并返回数组。。。查看我的编辑。我喜欢覆盖方法的想法,使它看起来像是有一个数组,而实际上没有。但是,在父类中,数组是公共的,但它也有一个getter/setter对。我不确定在我自己的代码之外,用来与类交互的是什么。我也不确定你所说的“调用者可以在parentInstance.params[1]=0.0;”下更改数组值是什么意思。不,这当然是可行的。我会考虑这个的。谢谢再想一想,如果我有20个参数,那就意味着40个新方法在名称之间来回移动。不太优雅。我同意,40种新方法是不优雅的。在我看来,无论你以何种方式削减它,依靠一系列逻辑上没有联系的任意双打都会导致不雅;我想不管你最终做什么,你都可能不得不接受一些。事实上,一些像枚举或常量一样的东西,比如公共静态int,生命的答案,宇宙的答案,万物=42;哎呀。没有完成最后的评论。无论如何,公共静态常数和枚举是常见的做法,我认为枚举被认为是更好的一点
double age = Param.AGE.getValue(params);