gpt4 book ai didi

java - 有没有办法重构这些构造函数?

转载 作者:行者123 更新时间:2023-12-03 23:05:49 29 4
gpt4 key购买 nike

所以我有一个对象,让我们称之为myObject

这是我对象的构造函数

private static class myObject {
public myObject(int argA) {
this.argA = argA;
}

public myObject(int argA, boolean argB) {
this.argA = argA;
this.argB = argB;
}

public myObject(int argA, int argC, int argD) {
this.argA = argA;
this.argC = argC;
this.argD = argD;
}

public myObject(int argA, String argE) {
this.argA = argA;
this.argE = argE;
}


public int argA = 1;
public boolean argB;
public int argC = 4;
public int argD = 5;
public String argE;


基本上,我有默认值,构造函数在需要时会覆盖这些默认值。
当我调用这些构造函数时,这使得代码非常干净

myObject newObject = new myObject(4);


但是,API给我一个参数列表,用于创建带有

List objectParams1 = Arrays.asList(1,3,4)
List objectParams2 = Arrays.asList(1,false)
List objectParams3 = Arrays.asList(1,"tomato")
myObject newObjectWithTheseParameters1 = ?;
myObject newObjectWithTheseParameters2 = ?;
myObject newObjectWithTheseParameters3 = ?;



使用参数列表创建该对象非常困难,因为它不知道要使用哪个构造函数。生成器方法与此相关吗?但是,这将使代码库更大,因为我不得不将此构造函数调用〜100次。

myObject objectA = myObject.builder().withargA(4).withArgB(true).build();

最佳答案

您只有四种情况,因此编写静态工厂方法非常容易:

static myObject create(List<?> args) {
int argA = (int) args.get(0);
switch (args.size()) {
case 1:
return new myObject(argA);
case 2:
if (args.get(1) instanceof Boolean) {
return new myObject(argA, (boolean) args.get(1))
}
return new myObject(argA, (String) args.get(1));
case 3:
return new myObject(argA, (int) args.get(1), (int) args.get(2));
default:
throw new IllegalArgumentException();
}
}


然后:

myObject newObjectWithTheseParameters1 = create(objectParams1);
// etc.


这是很粗略的(如果列表中的元素数量错误,类型的元素错误或装箱的基本元素为null,则运行时可能会以各种方式失败),但是我真的看不到如果参数来自列表,则还有其他选择。



不进行显式检查的另一种方法是使用反射来获取构造函数:

Class<?>[] classes =
args.stream()
.map(Object::getClass)
.map(YourClass::unboxedClass)
.toArray(Class<?>[]::new);


其中 unboxedClass是将 Integer.classBoolean.class转换为 int.classboolean.class的方法。然后:

return myObject.getClass().getConstructor(classes).newInstance(args);


(并处理所有检查的异常)。

关于java - 有没有办法重构这些构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61857111/

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