gpt4 book ai didi

Java模型对象设计

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:18:07 26 4
gpt4 key购买 nike

所以我一直在阅读一些Effective Java!本书中最鼓舞人心的部分之一是不可变对象(immutable对象)/构建器部分,布洛赫在该部分写了关于“构建器”的内容——类而不仅仅是 POJO。

注意:我在这里谈论的是模型对象:例如 ArticleCar

我之前是这样写这些对象的:

public class Car {

private String name;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

现在,正如您所看到的,这种设计在很多方面都有缺陷,它需要可变性,您必须首先使用构造函数然后设置名称来构造对象。

当然,现在您可以将 name 字段设置为 final 并将其用作构造函数中的参数,但是如果您有一个大对象包装,例如一些 SQL - 表,那么您将拥有像这样丑陋的构造函数:

public Car(int horsepowers, String name, String brand, int yearManufactured,
User owner, List<User> previousOwners) {
//Set the values
}

这在创建对象时变得不可读,而且这只是六个字段!

因此,Bloch 建议如下(具有不变性)

public class Car {

public static class Builder {

private String name;

public Builder setName(String name) {
this.name = name;
return this;
}

public Car build() {
reeturn new Car(this);
}
}

private final String name;

private Car(Builder builder) {
name = builder.name;
}

public String getName() {
return name;
}
}

//Construction example
Car car = new Car.Builder().setName("Speedy").build();

现在这给了我们不变性!如果你有一些不是原始的或不可变的对象,只需将它们复制到 Builder 的 setter 中,然后再复制到 Car 的 getter 中。

但它非常冗长,如果类足够小,我一直在使用构造函数参数。如果一个类需要一个可变字段,我只需将该字段设置为可变,前提是该类具有足够的属性(> 4 个)。

另一个问题是,当使用 android 并且该类具有例如 Bitmap 时,您必须返回实际位图而不是复制它,因为那是相当耗费性能的。

我见过很多这样的问题,但我似乎找不到关于这个问题的好答案:这些设计是否有任何标准,它们的设计如何?有什么好处/缺点?

提前致谢!

编辑:

问题是:

最佳构建对象模型的方法是什么,该对象模型应该是不可变的并且具有 A) 少量字段和 B) 大量字段?如何处理上述Bitmap问题和类似问题?使某些字段可变?

抱歉含糊不清。

最佳答案

Design Patterns这本书是目前设计模式的始祖。虽然它并不新鲜,但它似乎通过了时间的考验。

您可以阅读每种设计模式的详细现实示例、它们之间的关系、使用它们的方式和时间,以及对每种设计模式的详尽解释。 Builder 模式当然包括在内。

关于回答你的问题,我可以说说我的看法,当然不具有权威性。

我认为,如果您的字段数量较少,则可以使用构造函数。如果你拿checkstyle例如,它会针对 7 个参数发出警告。

但是,如果您确定您将很快重构该类,或者您将不得不扩展它,我认为构建器模式更好,因为它更容易重构。重构构造函数从来都不是一件有趣的事。

如果您超过 7 个参数,我认为 Builder 更好。我一直在我正在广泛从事的当前项目中使用它。

请注意,通过使用构建器模式,您不会说“好吧,我是一个不可变的对象构建器”。你说“好吧,我正在构建参数化对象”。因此,您的类(class)中有一组可变字段不是问题。但是,如果您将类命名为 ImmutableFooDTO,然后又添加了可变字段,则会导致混淆。

因此,如果有一组字段不能是可变的,则将它们标记为最终的,并使用构造函数/构建器并为可变字段提供 setter 。

关于Java模型对象设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458092/

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