簡體   English   中英

在Java 9中使用必需參數和可選參數構建抽象超類的子類對象的最佳方法是什么?

[英]What is the best way to build a subclassed object of an abstract superclass with required and optional parameters in Java 9?

有各種方法可以在Java中構建對象。 對於我的用例,讓我們假設我有一個帶有私有屬性字段的抽象Person類和一個名為Tom的子類。

1. Getters / Setters

Person類中的無參數構造函數,setter和getter。 可以使用Project Lombok的@Data注釋進行簡化。

Tom tom = new Tom(); // Subclass of Person
tom.setName("Tom");
tom.setAge(42);

我讀過,除非使用框架,否則應避免使用此方法。

2.參數化構造函數

使用構造函數參數構建對象。 具有各種可選和必需屬性的大對象的過多構造函數重載。 也可以使用Project Lombok的各種構造函數注釋進行簡化。

Tom tom = new Tom("Tom", 42);

然后, Tom的構造函數會調用super("Tom", 42) Person ,如果有許多可選參數,則可以使用構造函數重載。

3.構建器模式

因為構造函數重載可以快速實現真正的混亂,Josh Bloch展示了Builder Pattern。 同樣,這可以通過Project Lombok的@Builder注釋進行簡化。 這是非抽象Person類的外觀:

Person person = new Person.Builder().name("Tom").age(42).build();

嘗試將構建器模式與繼承一起使用很困難(但並非不可能),正如其他人在我之前所說的那樣。


我確信有很多方法可以構建一個對象,但我只列出了我熟悉的對象。

我的問題是:使用Java 8甚至Java 9功能,構建一個對象的絕對最佳方法是什么,該對象是具有必需和可選屬性的抽象超類的子類?

關於SO的許多教程和問題已經過時,並且可能不執行現在被認為是最佳實踐的內容。

遺憾的是,最佳做法在Java和OO中非常主觀,但我嘗試列出一些主要的客觀標准:

  1. 該類是否是子類不應該影響該類的API,包括它的構造函數應該是什么樣子。

  2. 施工后,物體應准備好使用 這意味着它的所有公共方法都應該在構造函數之后工作。 這取消了您的選項#1。 (除非被不友好的框架強迫)。

  3. 有一個“主”構造函數完成工作,並讓所有其他構造函數調用此工具。 除非你有一個也有很多構造函數的超類,在這種情況下事情變得更復雜,你很可能必須反映超類想要的東西。

  4. 它應該簡單直接地使用。 這意味着,除非使用它們變得困難,否則最好使用構造函數與構造函數。 如果有很多參數(對我來說超過3-4個),或者它們的組合可能太多(再次,對我來說超過3-4個),或者有一個深度的構造(必須構建其他對象)首先),然后我會使用一個建設者。

  5. 在任何情況下都不要使用Optional作為參數。

  6. 不要使用龍目島。 它可能會讓 (作者)的生活更輕松,但會讓所有那些必須閱讀代碼的人感到困惑。 請記住,我們閱讀代碼比寫作更頻繁! (這可能是一個值得商榷的問題)

  7. 繼承是棘手的,如果可能的話應該避免。 不要用它來共享代碼,這是一種反模式。 對於建築商來說也是如此。 您可以編寫一個可以返回不同實現類的構建器,但它不必(不應該)子類化其他構建器來執行此操作。

我可能忘記了一些規則,但除此之外,Java 8和9中沒有新的突破性語法來簡化構造。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM