我有一个刮刀,它扫描网页上的特定信息并从中创建一个对象。其中一个属性是 id ,稍后会使用来查询新对象的剩余属性。
因为构建这个对象的责任被分成几个类(刮刀类和使用其中一个属性查询的类),所以我想避免使用传递 Builder (另外,带有访问器的Builder模式对我来说似乎很奇怪。
同时,我想在正在构建的对象中避免空引用。
Guava的可选似乎不太适合,因为在构造完所有步骤之后,对象的属性肯定不会为null。
我可以创建单独的类,如下所示:
class ScrapeablePersonImportPart {
String surname;
Year yearOfBirth;
String externalId;
// ... getters, constructor ...
}
class PersonImport extends ScrapeablePersonImportPart {
SocialSecurityNumber ssn;
Color favoriteColor;
// ... getters, constructor ...
PersonImport( ScrapeablePersonImportPart part, SocialSecurityNumber ssn, Color favoriteColor ) {
this.surname = part.getSurname();
this.yearOfBirth = part.getYearOfBirth();
this.externalId = part.getExternalId();
this.ssn = ssn;
this.favoriteColor = favoriteColor;
}
}
或者我可以避免使用子类并使用合成。
随着程序的发展,构造可能会构成更多步骤。
具有多个单独类的解决方案是否合理?
答案 0 :(得分:1)
我会使用合成,因为你传递的是ScrapeablePersonImportPart
,你可以委托给它而不是继承它。由于您可能有一个新的XYZPart
被传递,因此委托是有意义的,因为无论如何都无法继承。
如果这些只是用于保存动态数据字段的虚拟对象,我很想使用HashMap
。