我经常遇到一个类,构造函数方法必须包含与类实例变量列表相同的参数列表。
正如您在示例中看到的那样,有一些" 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;
}
}
答案 0 :(得分:2)
可以使用名为Builder的模式。在question
中对此进行了解释基本上它的工作原理如下:
以下是一个例子:
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。