当前位置: 首页 > 面试题库 >

为什么我不应该使用不可变的POJO而不是JavaBean?

楚墨一
2023-03-14
问题内容

我现在已经实现了一些Java应用程序,到目前为止仅实现了桌面应用程序。我更喜欢使用不可变对象在应用程序中传递数据,而不是使用带有变量(setter
和getter )的对象,也称为JavaBeans。

但是在Java世界中,使用JavaBeans似乎更为常见,而且我不明白为什么应该使用JavaBeans。就个人而言,如果代码仅处理不可变的对象而不是始终改变状态,则代码看起来会更好。

第15项:最小化可变性有效的Java 2ed 中也建议使用不可变对象。

如果我有一个Person实现为 JavaBean 的对象,它将看起来像:

public class Person {
    private String name;
    private Place birthPlace;

    public Person() {}

    public setName(String name) {
        this.name = name;
    }

    public setBirthPlace(Place birthPlace) {
        this.birthPlace = birthPlace;
    }

    public String getName() {
        return name;
    }

    public Place getBirthPlace() {
        return birthPlace;
    }
}

Person实现为 不可变 对象:

public class Person {
    private final String name;
    private final Place birthPlace;

    public Person(String name, Place birthPlace) {
        this.name = name;
        this.birthPlace = birthPlace;
    }

    public String getName() {
        return name;
    }

    public Place getBirthPlace() {
        return birthPlace;
    }
}

或更接近structC:

public class Person {
    public final String name;
    public final Place birthPlace;

    public Person(String name, Place birthPlace) {
        this.name = name;
        this.birthPlace = birthPlace;
    }
}

我还可以在不可变对象中使用吸气剂来隐藏实现细节。但是由于我只将它用作一个,struct所以我倾向于跳过“获取器”,并使其保持简单。

简而言之,我不明白为什么使用JavaBeans更好,还是我可以并且应该继续使用我不变的POJO?

许多Java库似乎对JavaBeans都有更好的支持,但是随着时间的推移,对不可变POJO的更多支持可能会越来越流行?


问题答案:

首选JavaBeans

  • 您必须与期望他们的环境互动
  • 您有很多属性,在实例化时进行所有初始化将很不方便
  • 您的状态由于某些原因而昂贵或无法复制,但需要更改
  • 您认为在某个时候您可能必须更改属性的访问方式(例如,从存储的值转换为计算的值,访问授权等)
  • 您想要遵守无意识地坚持认为使用JavaBeans更加“面向对象”的编码标准

首选不可变POJO

  • 你有一些简单的属性
  • 您不必与假定JavaBean约定的环境进行交互
  • 克隆对象时很容易(或者至少是可能的)复制状态
  • 您根本不打算克隆对象
  • 您非常确定不必像上面那样修改属性的访问方式
  • 您不必介意抱怨(或嘲笑)您的代码如何不够“面向对象”


 类似资料:
  • 问题内容: 从log.go(执行日志包): 只是一个函数包装器,为什么我应该用它代替or ? 有实际原因吗? 问题答案: 两件事不同: 通过包日志进行打印对于并发goroutine是安全的(而普通的则不是) 日志可以自动添加计时信息。 因此,这是两件完全不同的事情。log用于记录和格式化。(好吧,log使用相同的动词和标志,但这很方便)。

  • 问题内容: Python 2.6引入了一个功能。 为什么有这个必要?可以总是输入而不是。 后者更多吗? 问题答案: PEP 3114描述了此更改。动机摘录: 该PEP建议将该方法重命名为,与Python中所有其他协议一致,在该协议中隐式调用方法作为语言级协议的一部分,并引入一个名为的内置函数来调用方法,与显式调用其他协议的方式。 请务必阅读此PEP,以获取更多有趣的细节。 至于为什么 你 要使用内

  • 我有一个用例,其中将有数据流到来,而我不能以相同的速度消耗它,并且需要一个缓冲区。这可以使用SNS-SQS队列来解决。我知道Kinesis解决了同样的目的,那么有什么区别呢?为什么我应该喜欢(或者不应该喜欢)Kinesis?

  • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?

  • 为什么这是“良好的编码实践”?例如,当我制作一个石头剪刀游戏机时,大多数人建议使用枚举而不是字符串。有什么区别?

  • 问题内容: 我是一名C ++程序员,偶尔使用MySQL处理数据库,但是我的SQL知识非常有限。但是,我当然愿意改变这一点。 目前,我正尝试仅通过SQL查询对数据库中的数据进行分析(!)。但是我将放弃,而是将数据导入C 并使用C 代码进行分析。 我已经与同事讨论了这一点,他们也促使我使用C ++,他说SQL并不是用于复杂的分析,而是主要用于导入(从现有表中)和导出(到新表中)数据,还有更多内容。例如