java - 如何在具有许多字段的java中创建一个不可变的类?

标签 java immutability

我有一个面试问题,面试官问我,“你将如何在 java 中创建一个不可变类,哪个类将包含 100 多个字段?”

正如我们所知,要创建不可变类,我们需要将类声明为 final,需要将所有字段声明为 final,并且该类中不应存在任何 setter 方法。我们需要在构造函数中初始化这些字段。

但是当我们有超过10个字段或更多字段时会发生什么?我们不能传递构造函数中的所有字段吗?在这种情况下,我们如何创建不可变类?

最佳答案

这里的字段数是无关紧要的,即使在一个类中有多个字段是糟糕的设计并且是应该重构类的标志。要使类不可变,您需要具备以下条件:

  1. 没有设置方法。这意味着您要么需要一个 Builder 内部类来在调用构造函数之前设置字段的值,要么只是将所有字段作为构造函数参数包含在内(强烈建议不要这样做)。
  2. 将类声明为final。这可以防止类扩展和调用 super
  3. 如果您的不可变类中有非原始字段,您需要复制它们并在每次更改它们时返回副本。

顺便说一句,据我所知,Java 构造函数可以处理 255 parameters .所以对于这次采访,构造函数参数是一个选项。

关于java - 如何在具有许多字段的java中创建一个不可变的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56598456/

相关文章:

java - JPA 和 Hibernate : compare only time portions of timestamps

java - 创建一个新的 Java 项目

f# - 这是用于相当快速的无限递归序列的惯用 F# 吗?

ruby - 为什么 Matz 选择在 Ruby 中默认设置可变字符串?

javascript - 我在改变 reducer 中的 redux 状态吗?

clojure - 为什么更多的语言不使用像 Clojures 这样的不可变模型?

java - 如何使用并行流将 foreach 更改为 lambda

java - Kafka AvroSchema 未生成,当一个类具有数据类型为对象类的字段时

java - 如果日期在数据库中存储为像 (132011) 这样的字符串,那么在 hibernate 中使用 to_date() 是否正确?

scala - 关于复制案例类的表现