我想创建一个类,里面有大约60个双精度类型的字段。然后,我需要创建这个类的不同实例,通过构造函数只对其中一些字段(大约4-5个字段)赋值,将其他字段保留为默认值(0)。
问题是我不想有一个60个参数的构造函数,因为填充所有必填字段会浪费时间。此外,我不想创建公共方法来逐个设置字段的值。
我在考虑java注解,比如
public @interface MyAnnotation{
public double f1() default 0;
public double f2() default 0;
public double f3() default 0;
...
public double f60() default 0;
}这样我就可以只指定我需要的参数
@MyAnnotation(f1=2.1 , f48=3.5)无论如何,我在这方面没有太多经验,我不确定它是否能满足我的需求。从广义上讲,我的目标是拥有如下内容:
MyClass c1 = new MyClass(f1=2.1 , f48=3.5);
MyClass c2 = new MyClass(f4=5 , f30=12.9);
public class MyClass{
double f1;
double f2;
double f3;
...
double f60;
}有没有办法让类构造函数也有类似的命名呢?
附注:我不是程序员,但我对Java反射很了解,所以如果需要的话,没问题。
发布于 2016-02-19 02:18:04
像这样的东西?还是我太离谱了?
public class Blank{
public void Blank(int [] fSpots, double[] vaules0{
}然后循环设置特定的斑点等于这些值?
发布于 2016-02-19 02:20:05
看看'builder‘解决方案。创建一个镜像主类的可变类,为每个字段设置setter(为了更容易访问,可以使用fluent api ),然后让主不可变类以builder为参数,并从中复制数据。为了避免手动创建巨大的构建器,您可以使用一些帮助程序,比如https://projectlombok.org/features/Builder.html
或者,您可以将groovy与带有http://docs.scala-lang.org/tutorials/tour/named-parameters.html的xtend或带有一个活动注释的http://docs.groovy-lang.org/latest/html/documentation/#_named_argument_constructor一起使用。
发布于 2016-02-19 02:56:38
这很疯狂,但是:
enum Field {
F1, F2, F3, F48;
Arg set(Double value)
{
return new Arg(this, value);
}
static final class Arg
{
final Field field;
final Double value;
private Arg(Field f, Double v)
{
this.field = f;
this.value = v;
}
}
}
final class BadModel
{
private static final Double ZERO = (double) 0;
private final Map<Field, Double> fields = new EnumMap<>(Field.class);
BadModel(Field.Arg... args)
{
for (Field.Arg e : args)
this.fields.put(e.field, e.value);
}
Double get(Field field)
{
return fields.getOrDefault(field, ZERO);
}
public static void main(String... argv)
{
BadModel obj = new BadModel(Field.F1.set(2.1), Field.F48.set(Math.PI));
double f3 = obj.get(Field.F3);
System.out.println(f3);
}
}我鼓励您退后一步,在假定具有稀疏字段的对象是解决问题的答案之前,为您的底层问题寻求一些帮助。
https://stackoverflow.com/questions/35489025
复制相似问题