假设我们开发一个简单的博客网站后端,并且该应用程序具有三个或更多 POJO 类,例如 Post
、User
、类别
。
所有类都有相同的字段,例如id
、createdDate
、updateDate
。
作为 java 程序员,我们使用 private
访问修饰符将封装应用于类中的所有字段。我的问题很简单:我们可以使用默认访问修饰符和继承来执行封装吗?
代码:
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
}
最佳答案
protected 修饰符
通常的做法是使用protected
访问修饰符封装父类中的类成员。
包私有(private)字段和方法对于位于父类包之外的子类不可见。相反,任何子类都可以访问 protected
变量和行为,无论其位置如何。
组合与继承
继承并不总是有益的,事实上在很多情况下都没有好处。在做出类设计决策(例如特定类是否从另一个类派生)之前,您需要考虑所有优点和缺点。
扩展BaseModel
有哪些好处?扩展?
感觉您无法从这里的多态性中获益。因为您可以与父类型 BaseModel
一起使用的唯一行为是创建和更新日期的 getter 和 setter。同时您将无法访问子类的特定行为。
它看起来更像是一个缺点,因为 BaseModel
不是为扩展而设计的。 IE。它也不包含任何有用的实现(我没有考虑 getters/setters),没有抽象方法意味着由它的子类实现(这将是有利的多态性的场景)。
事实上,您扩展 BaseModel
只是为了重用几个变量。这并不是使用继承的令人信服的理由。
您的示例是用 HAS A 替换 IS A 关系(Post
是 BaseModel
)的完美案例strong> 关系(Post
包括 BaseModel
)。
当一个类的实例字段包含另一个类的实例而不是扩展该类时,这种设计技术称为组合。
作为一般规则,组合是比继承更可取的方法。除了继承之外,它还允许重用行为,同时它的类紧密耦合。
如果您将 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
}
关于java - 封装在Java模型类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71637278/