相当于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);