假設我們開發了一個簡單的博客網站后端,并且該應用程式具有三個或更多POJO類,例如Post, User, Category.
所有類都具有相同的欄位,例如id, createdDate, updateDate。
作為 java 程式員,我們使用訪問修飾符將封裝應用于類中的所有欄位。private我的問題很簡單:我們可以使用帶有Inheritance的默認訪問修飾符執行封裝嗎?
代碼:
public abstract class BaseModel {
String id;
LocalDateTime createdDate;
LocalDateTime updatedDate;
// getters and setters
}
public class Post extends BaseModel{
private String slug;
private String name;
private String title;
// other fields, getters and setters
}
public class Category extends BaseModel{
private String name;
private String slug;
// other fields, getters and setters
}
uj5u.com熱心網友回復:
受保護的修飾符
通常的做法是使用protected訪問修飾符將類成員封裝在Parent類中。
包私有欄位和方法對位于父類包之外的子類不可見。相反,任何子類都可以訪問變數和行為,而不管其位置如何。protected
組合與繼承
繼承并不總是有益的,事實上有很多情況并非如此。在做出類設計決策之前,您需要考慮所有的利弊,例如一個特定的類是否會派生自另一個類。
擴容有什么好處?_BaseModel
感覺你不能利用這里的多型性。因為您可以對父型別 BaseModel使用的唯一行為是用于創建和更新日期的 getter 和 setter。同時,您將無法訪問子類的特定行為。
它看起來更像是一個缺點,因為BaseModel 它不是為擴展而設計的。即它既不包含任何有用的實作(我沒有考慮getter/setter),也沒有抽象方法打算由它的子類實作(這將是一個有利的多型性場景)。
事實上,您BaseModel只是為了重用幾個變數而進行擴展。這不是使用繼承的令人信服的理由。
您的示例是用HAS A關系(includes )替換IS A關系(Postis a BaseModel)的完美案例。PostBaseModel
設計技術,當一個類包含其實體欄位時,另一個類的實體而不是擴展這個類,稱為Composition。
作為一般規則,組合是比繼承更可取的方法。除了繼承之外,它還允許重用行為,同時它的類緊密耦合。
如果您創建BaseModel一個具體類并將組合應用于其他類,您的代碼將如下所示。
public class BaseModel {
private String id;
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
// getters and setters
}
public class Post {
private BaseModel base;
private String slug;
private String name;
private String title;
// other fields, getters and setters
}
public class Category {
private BaseModel base;
private String name;
private String slug;
// other fields, getters and setters
}
uj5u.com熱心網友回復:
默認修飾符表示它只能在包中訪問。因此,如果您在不同的包中使用子類,這些欄位將無法訪問。
如果這是你想要的,太好了!它被封裝了。
如果那不是您想要的,那就太可惜了……但是您仍然擁有受保護的修飾符。
這讓一個子類繼承欄位,即使它在不同的包中。
也請參閱此答案:Java 中 public、protected、package-private 和 private 有什么區別?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/451608.html
