构造方法必须包含所有实例变量

时间:2016-01-16 10:56:21

标签: java

我经常遇到一个类,构造函数方法必须包含与类实例变量列表相同的参数列表。

正如您在示例中看到的那样,有一些" SOME"代码使这个hapend。 我想知道如何让这个过程不那么痛苦?

示例:

public class VimeoUser extends Schema {

    @Getter @Setter private String uri;
    @Getter @Setter private String name;
    @Getter @Setter private String link;
    @Getter @Setter private String location;
    @Getter @Setter private String bio;
    @Getter @Setter private String createdTime;
    @Getter @Setter private String account;

    @Getter @Setter private Map<String,Integer> statistics = new HashMap<>();

    @Getter @Setter private List<Website> websites = new ArrayList<>();
    @Getter @Setter private List<Portrait> portraits = new ArrayList<>();

    public VimeoUser(
            String uri,
            String name,
            String link,
            String location,
            String bio,
            String createdTime,
            String account,
            Map<String,Integer> statistics,
            List<Website> websites,
            List<Portrait> portraits){

    this.uri = uri;
    this.name = name;
    this.link = link;
    this.location = location;
    this.bio = bio;
    this.createdTime = createdTime;
    this.account = account;
    this.statistics = statistics;
    this.websites = websites;
    this.portraits = portraits;

    }
}

4 个答案:

答案 0 :(得分:2)

可以使用名为Builder的模式。在question

中对此进行了解释

基本上它的工作原理如下:

  • 创建内部静态类构建器
  • 创建一个私有构造函数,将构造函数作为Builder
  • 的对象作为参数
  • 在Builder类中添加设置单个值并返回此方法的方法(当前对Builder类实例的引用)
  • 在类的构造函数的主体中,使用Builder中传递的值来设置每个属性
  • 在Builder中添加一个方法构建,调用类的私有构造函数

以下是一个例子:

public class NutritionalFacts {
    private int sodium;
    private int fat;
    private int carbo;

    public class Builder {
        private int sodium;
        private int fat;
        private int carbo;

        public Builder(int s) {
            this.sodium = s;
        }

        public Builder fat(int f) {
            this.fat = f;
            return this;
        }

        public Builder carbo(int c) {
            this.carbo = c;
            return this;
        }

        public NutritionalFacts build() {
            return new NutritionalFacts(this);
        }
    }

    private NutritionalFacts(Builder b) {
        this.sodium = b.sodium;
        this.fat = b.fat;
        this.carbo = b.carbo;
    }
}

并使用它执行以下操作:

NutritionalFacts nutritionalFacts = new NutritionalFacts.Builder()
        .fat(200).carbo(50).build();

使用此模式而不是pojo与setter和getter非常有用,因为它也可以用它来构建不可变对象(包含所有final字段的对象)。如果需要在多线程环境中共享它,则不可变对象很有用,因为不需要同步对它的访问。

此外,可以在build方法中添加一些控件,以确保按预期设置所有字段。

答案 1 :(得分:1)

构建器模式

如果要以更易读的方式创建对象,可以使用简单的构建器模式。 Lombok支持此@Getter@Setter。您只需添加@Builder注释,一切都应该正常。

@Getter
@Builder
public class SomeClass {
    private final String valueOne;
    private final String valueTwo;
}

然后你可以用这种方式创建对象。

SomeClass someClass = SomeClass.builder()
        .valueOne("one")
        .valueTwo("two")
        .build();

流利的访问者方法

创建类的替代方法是使用@Accessors注释fluent = true。然后,您可以创建一个空对象,并以简单的方式设置所需的值。

@Getter
@Setter
@Accessors(fluent = true)
public class SomeClass {
    private String valueOne;
    private String valueTwo;
}

使用这种方式的简单样本。

SomeClass someClass = new SomeClass()
        .valueOne("one")
        .valueTwo("two");

答案 2 :(得分:1)

我发现你已经在使用Lombok了。有一个@AllArgsConstructor类级注释,可以为您生成构造函数。如果您还想要默认构造函数,请另外使用@NoArgsConstructor

有关构造函数生成注释here的更多信息。

答案 3 :(得分:0)

我想为数据库建模编写pojos并不一定需要构造函数而不是默认的no-arg构造函数。如果在某些情况下无论如何都需要,可以使用Getters和setter。