gpt4 book ai didi

java - 是否推荐使用这种初始化方法?

转载 作者:行者123 更新时间:2023-11-30 06:06:17 25 4
gpt4 key购买 nike

因此,当我编写自己的项目时,初始化对象时出现了问题。我的类有很多属性需要启动,但并不总是全部,这。就在那时我想到了这个想法(但我不确定它是否以前在任何地方使用过):

public class MyClass {
public static final int DEFAULT1 = 1;
public static final int DEFAULT2 = 2;
public static final int DEFAULT3 = 3;
private int attr1;
private int attr2;
private int attr3;
private MyClass(){
attr1 = DEFAULT1;
attr2 = DEFAULT2;
attr3 = DEFAULT3;
}
public static MyClass create(){
return new MyClass();
}
public MyClass setAttr1(int attr1){
this.attr1 = attr1;
return this;
}
public MyClass setAttr2(int attr2){
this.attr2 = attr2;
return this;
}
public MyClass setAttr3(int attr3){
this.attr3 = attr3;
return this;
}
}

当我创建一个新的 MyClass 实例时,我会这样做:

MyClass obj = MyClass.create().setAttr1(3).setAttr3(1);

它对我有用(有点因为我测试了它,但我还没有决定在我的项目中使用它)。我的问题是,这合法吗?它会产生任何类型的内存/执行问题吗?

最佳答案

您的用例是Builder设计模式的完美示例。了解更多关于 hereoracle doc about builder 。另请阅读 Java 传奇人物 Joshua 为何 Builder 模式比其他创建模式有优势,这在他的书《java 的最佳实践》中进行了讨论 here .

使用Builder设计模式转换后的类将如下所示。请注意,我假设 attr1 是可选的,而 attr2attr3 是强制的。

class MyClass {
public static final int DEFAULT1 = 1;
public static final int DEFAULT2 = 2;
public static final int DEFAULT3 = 3;

// assume attr1 is optional
private int attr1;
// assume attr2,3 is mandatory
private int attr2;
private int attr3;


public MyClass(MyClassBuilder myClassBuilder) {
this.attr1 = myClassBuilder.attr1;
this.attr2 = myClassBuilder.attr2;
this.attr3 = myClassBuilder.attr3;
}

//Builder Class
public static class MyClassBuilder {

// required parameters
private int attr2;
private int attr3;
// optional parameters
private int attr1;

public MyClassBuilder(int attr2, int attr3){
this.attr2 = attr2;
this.attr3 = attr3;
}

public MyClassBuilder setAttr1(int attr1) {
this.attr1 = attr1;
return this;
}


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

}

}

现在,使用下面的代码之后,您可以创建对象(带/不带)可选参数。

public class MyClassTest {

public static void main(String[] args) {
MyClass myClass = new MyClass.MyClassBuilder(10,20).build();
// without optional param
System.out.println("without optional param");
System.out.println("attr1 "+ myClass.getAttr1());
System.out.println("attr2 "+ myClass.getAttr2());
System.out.println("attr3 "+ myClass.getAttr3());

// with optional param
System.out.println("with optional param");
MyClass myClassWithAllParam = new MyClass.MyClassBuilder(10,20).setAttr1(5).build();
System.out.println("attr1 "+ myClassWithAllParam.getAttr1());
System.out.println("attr2 "+ myClassWithAllParam.getAttr2());
System.out.println("attr3 "+ myClassWithAllParam.getAttr3());

}
}

其输出如下:-

without optional param
attr1 0
attr2 10
attr3 20
with optional param
attr1 5
attr2 10
attr3 20

关于java - 是否推荐使用这种初始化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com