首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义Java类的动态构造函数结构

自定义Java类的动态构造函数结构
EN

Stack Overflow用户
提问于 2016-02-19 02:00:38
回答 6查看 2.6K关注 0票数 2

我想创建一个类,里面有大约60个双精度类型的字段。然后,我需要创建这个类的不同实例,通过构造函数只对其中一些字段(大约4-5个字段)赋值,将其他字段保留为默认值(0)。

问题是我不想有一个60个参数的构造函数,因为填充所有必填字段会浪费时间。此外,我不想创建公共方法来逐个设置字段的值。

我在考虑java注解,比如

代码语言:javascript
复制
public @interface MyAnnotation{

    public double f1() default 0;
    public double f2() default 0;
    public double f3() default 0;
    ...
    public double f60() default 0;

}

这样我就可以只指定我需要的参数

代码语言:javascript
复制
@MyAnnotation(f1=2.1 , f48=3.5)

无论如何,我在这方面没有太多经验,我不确定它是否能满足我的需求。从广义上讲,我的目标是拥有如下内容:

代码语言:javascript
复制
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反射很了解,所以如果需要的话,没问题。

EN

回答 6

Stack Overflow用户

发布于 2016-02-19 02:18:04

像这样的东西?还是我太离谱了?

代码语言:javascript
复制
    public class Blank{
      public void Blank(int [] fSpots, double[] vaules0{
            }

然后循环设置特定的斑点等于这些值?

票数 1
EN

Stack Overflow用户

发布于 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一起使用。

票数 1
EN

Stack Overflow用户

发布于 2016-02-19 02:56:38

这很疯狂,但是:

代码语言:javascript
复制
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);
  }

}

我鼓励您退后一步,在假定具有稀疏字段的对象是解决问题的答案之前,为您的底层问题寻求一些帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35489025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档