java - 封装在Java模型类中

标签 java oop inheritance encapsulation composition

假设我们开发一个简单的博客网站后端,并且该应用程序具有三个或更多 POJO 类,例如 PostUser类别

所有类都有相同的字段,例如idcreatedDateupdateDate

作为 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 关系(PostBaseModel)的完美案例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/

相关文章:

java - 如何找到路线的所有端点(Apache Camel,Java)

perl - 在@ISA 上使用拼接在 perl 5.12.2 中是否存在问题?

java - 解决 Java 中的多重继承问题

java - 检查是否运行倒计时?

java - 如何使用 Gradle 创建独立的自执行 jar 文件?

javascript - 理解 JavaScript 中的原型(prototype)

c# - c# 2.0(BindingList)中泛型缺少协变的解决方案

c# - 如何使用泛型而不是继承来拥有多个版本的东西

Java,多线程类,配置,避免同步

ruby - Ruby 模块中的私有(private)类(不是类方法)?