当前位置: 首页 > 知识库问答 >
问题:

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

朱天逸
2023-03-14

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

但是当我们有10多个字段或者更多字段的时候会发生什么呢?我们不能传递构造函数中的所有字段,对吧?在这个场景中,我们如何创建一个不可变的类呢?

共有1个答案

顾梓
2023-03-14

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

  1. 没有setter方法。这意味着您要么需要一个builder内部类,它在调用构造函数之前设置字段的值,要么只是将所有字段包含为构造函数参数(强烈推荐使用)。
  2. 将类声明为final。这将防止类扩展和调用super
  3. 如果不可变类中有非基元字段,则需要复制它们,并在每次对它们进行更改时返回副本。

顺便说一句,据我所知,Java构造函数可以处理255个参数。因此在这次访问中,构造函数参数将是一个选项。

 类似资料:
  • 我创建了一个带有日期字段的不可变类。我如何确保即使是日期字段也是不可变的,因为即使您将日期字段设为final,您以后仍然可以为它分配一个不同的值?

  • 我有一个静态编程语言数据类,我正在用许多不可变属性构建它,这些属性是从单独的SQL查询中获取的。如果我想使用构建器模式构建数据类,如何在不使这些属性可变的情况下做到这一点? 例如,而不是通过构造 我想用 同时仍然使用Kotlin的数据类特性和不可变属性。

  • 问题内容: 我有Java / Kotlin互操作问题。Kotlin不可变列表被编译为可变的普通java.util.ArrayList! Kotlin(图书馆): Java(消费者): 从Java的角度来看,如何也使我的Kotlin类完全不可变? 问题答案: 默认情况下,Kotlin中的所有非集合都是 编译时只读类型 ,但不是 不可变的 。请参见以下代码段: 要真正拥有一个不变的列表,请考虑Guav

  • 我需要将可变列表对象转换为不可变列表。java中可能的方法是什么?

  • 问题内容: 我有一个包含三个字段(所有字符串类型)的“报告”对象列表- 我有一个排序代码,就像 由于某种原因,我没有排序顺序。一个建议在字段之间放置空格,但是为什么呢? 你认为代码有什么问题吗? 问题答案: 你认为代码有什么问题吗? 是。为什么在比较它们之前将三个字段加在一起? 我可能会做这样的事情:(假设字段按照你希望对其进行排序的顺序)

  • 问题内容: 我想在Android中创建带有多列的表格。我看到的大多数示例都是2列。(我是Java和Android的新手。)我需要3-4列,并且应该能够在表中动态添加行。谁能给我提供示例代码。(我在WIN 7中使用Eclipse) 问题答案: 我假设您正在谈论的是TableLayout视图,而不是数据库中的表? 如果是这样,这是一个具有三列三行的表的XML示例。 每个 元素在表中创建一行,并且该元素