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

关于不可变类

斜博超
2023-03-14

我有以下查询,我正在研究Java不可变类的概念,并得出以下分析。。

  • 所有字段必须是私有的,最好是最终的
  • 确保类不能被覆盖-使类成为最终类,或者使用静态工厂并保持构造函数私有
  • 字段必须从构造函数/工厂填充
  • 不要为字段提供任何setter
  • 小心收集。使用Collections.unmodifiable*。
  • 此外,集合应该只包含不可变对象
  • 所有getter必须提供不可变对象或使用防御性复制
  • 不要提供任何改变Object内部状态的方法。

现在我有下面的课…

public final class Bill {

    private final int amount;
    private final DateTime dateTime;
    private final List<Integers> orders;

}

请告知如何将其设置为不可变类。

共有3个答案

梁兴文
2023-03-14

由于amount是值类型,datetime是不可修改的,如果您在其getter中返回orders属性的Collections.unmodifiable()版本,该类将变成不可修改的。

卢元龙
2023-03-14

由于int是一个原语并且DataTime(我猜来自JodaTime)是不可变的,因此您唯一需要做的就是确保使用不可变列表:

public final class Bill {
    ...
    public Bill(int amount, DateTime dateTime, List<Integer> orders) {
        this.amount = amount;
        this.dateTime = dateTime;
        this.orders = Collections.unmodifiableList(orders);
    }
    ...
}

显然,您还需要一个构造函数来初始化final字段以及访问这些字段的一些方法。

充高扬
2023-03-14

您的类是不可变的。现在您可能想要添加一些方法

public final class Bill {

    private final int amount;
    private final DateTime dateTime;
    private final List<Integers> orders;

    public Bill(int amount, DateTime dateTime, List<Integer> orders) {
        this.amount = amount; //primitive type: ok
        this.dateTime = dateTime; //joda.DateTime is immutable: ok
        this.orders = new ArrayList<Integer> (orders); //make a copy as the caller could modify the list at its end
    }

    // no method that adds or removes from the list

   public List<Integer> getOrders() {
       return Collections.unmodifiableList(orders); //defensive copy
   }
}

或者,可以使用< code > this . orders = collections . unmodifieblelist(orders);并从getOrders()返回它:< code >返回订单;,它强制您不应该修改该列表,即使在您的类中也是如此。

 类似资料:
  • 问题内容: 当我们使用数组从数组创建列表时,该列表是不可变的。我只是想知道为什么当(或)的基本目的是具有动态大小并能够随意添加和删除元素时,为什么要创建一个不可变列表。当我们需要固定大小的数据结构时,我们选择数组;当我们需要动态数据结构时,我们选择或或等等。那么拥有不可变列表的目的是什么?我在做作业时遇到了这个问题。 问题答案: 当我们使用java.util.Arrays.asList()从数组创

  • 问题内容: 关于id类型对象str(在python 2.7中)的某些事情使我感到困惑。该str类型是不可变的,因此我希望一旦创建它,​​它将始终具有相同的id。我相信我说的话不太好,所以我将发布一个输入和输出序列的示例。 因此与此同时,它一直在变化。但是,在有一个指向该字符串的变量之后,情况发生了变化: 因此,一旦变量保存了该值,它似乎就冻结了。确实,在和之后o, 的输出再次更改。 这是不相同的行

  • 问题内容: 您能否澄清一下,为什么在我们将 final 关键字设为不变时,为什么 在上课之前需要 final 关键字。我的意思是,如果我们将所有属性声明为私有和最终的,那么它也是一个不可变的类,不是吗? 很抱歉,这个问题似乎很简单,但是我对此感到非常困惑。帮帮我。 编辑:我知道一个声明为final的类不能被子类化。但是如果每个属性都是私有和final的,那有什么区别呢? 问题答案: 正如堆纸器所说

  • 问题内容: 我找到了一篇有趣的代码文章: 我真的很好奇了解创建此类的优势。我知道这里的此类对象是不可变的,因为一旦初始化就无法更改其变量值。我以前从未做过这样的事情,而且我真的不了解它的优势。 为什么是个好习惯? 您能说出可以使用这种方法的情况吗? 常量或只读变量呢?那不是很相似吗? 在文章中说,这不利于应用程序的性能。 但是为什么 呢? 问题答案: 您提到的示例是不可变对象。它在编程语言中被广泛

  • 问题内容: 我对什么是不可变类型感到困惑。我知道该float对象被认为是不可变的,在我的书中有这样的例子: 由于类的结构/层次结构,这是否被认为是不可变的?意思float是在类的顶部,是它自己的方法调用。类似于此类示例(即使我的书说的dict是可变的): 可变的东西在类内部具有方法,例如以下类型: 另外,对于最后一个,如果我将这种类型的set传递给它: 不调用该example方法,它返回一个字典。

  • 本文向大家介绍python不可变变量?相关面试题,主要包含被问及python不可变变量?时的应答技巧和注意事项,需要的朋友参考一下 不可变对象是指不可以被引用改变的对象,如字符串 #