首页 > 解决方案 > 对象中的 Java 状态检查方法与关注点分离

问题描述

我有一门课如下

public class Employee {
    private String id;
    private String name;
    private String address;
    private String department;

    //setters and getters
    //overridden equals and hashcode methods

    public Boolean hasAllEmployeeFields() {
        //null and empty check on fields
    }

    public Boolean hasAddress() {
        //null and empty check on Address
    }

    public Boolean hasAssignedDepartment() {
        return department != null;
    }
}

除了 setter 和 getter 之外,this 还有一些方法来确定对象的状态。由于这些方法旨在确定对象的状态,因此我认为这些方法非常属于类。一些例子是 Java 的 Date、Calendar 和 String 类等。这些对象保存数据,也有几种方法来确定状态。

另一种方法是“关注点分离”,我们将对象保留为带有属性、setter 和 getter 的 POJO,并将方法移动到实用程序。使用这种方法,检查状态的每个人都应该首先记住检查实用程序类是否存在实用程序方法。而且我已经看到几个应用程序具有代码重复和逻辑来在多个地方检查这些状态。

我更倾向于将这些方法保留在 Employee 对象中的第一种方法。但是当我提出这个讨论时,我想我们的大多数同事都会支持关注点分离的方法。有人可以帮助我了解与关注点分离相比我的想法如何。

标签: javaencapsulationpojoseparation-of-concerns

解决方案


封装是Java中OOP的基本特征之一。

在我看来,一个对象应该能够以最高的安全性(想想当它的状态存储在没有 getter 的私有字段中时)和准确性(因为对象包含所有内部属性)来查询它的特性。如果以这种方式设计,一个对象是原子的、自主的。

如果你想确定一个物体的特性,问它,对吗?

你的方法: hasAllEmployeeFields, hasAddress... 就是很好的例子。

当且仅当对象本身无法确定特征并且需要来自另一个对象的合作时,该特征才应该可以从外部查询。

例如:我们有一个对象Market {double avgPrice;}和一个实体对象 ty Product {double price;}。为了确定这Product是否是奢侈品,我们需要通过方程来配合这两个对象price > 5 * avgPrice。因此,特性确定逻辑应该放在实用程序方法中。


推荐阅读