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

对不可变类使用最终私有或私有setter

东门子昂
2023-03-14

我在这里读了一些关于创建不可变对象的书,我想知道,我有以下类:

final public class AnonymousCilent {

    final private String anonymousCilentID;

    public AnonymousCilent(String anonymousCilentID) {
        this.anonymousCilentID = anonymousCilentID; 
    }

这是Oracle建议创建不可变类的方式,但是,在C#中,你可以声明你的setter私有,Java如果我这样做,它仍然是不可变的吗?

private String anonymousCilentID;

public AnonymousCilent(String anonymousCilentID) {
    this.setAnonymousCilentID(anonymousCilentID);
}

public String getAnonymousCilentID() {
    return anonymousCilentID;
}

private void setAnonymousCilentID(String anonymousCilentID) {
    this.anonymousCilentID = anonymousCilentID;
}

实现私有setter而不是使私有变量为final并使用构造函数有什么错?

共有3个答案

万俟棋
2023-03-14

一个私人的setter是完全没有意义的。任何可以调用私有setter的代码也可以直接写入变量。这意味着不能保证,因为您将setter设置为私有,所以代码不会修改变量。

阎智
2023-03-14

将字段设置为“最终”有两个作用:

  • 要求通过构造函数设置值(或至少在构造时解析)
  • 禁止为字段创建setter

如果字段中的数据类型不可变(就像数组一样),这应该足以使对象不可变。不可变类基本上意味着它的状态在实例化后不能更改,如果有任何更改,它将生成对象的新实例。

韦胜泫
2023-03-14

原因是将方法设置为私有只会影响方法的范围。如果您想要一个真正不可变的变量,那么您必须将其设置为final。这样就不能对变量进行变异。

还可以在getAnonymousClientID方法中返回用户ID的克隆。

默认情况下,Java中所有对象都是可变的。

编辑:所以你要做的就是像这样在get方法中返回你的userID:

public String getUserID() {
    return (String) userID.clone();
}
 类似资料:
  • 有没有可能的方法来模拟一个私人的最终场? 提前谢谢你们。

  • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。

  • 本书之前提到了“封装”的概念,即指将一系列指令放在一个函数体内部的处理过程。而这样的做法则是为了将函数的接口与它的实现分离(函数接口指如何使用这个函数,函数实现则指如何去实现这个函数及实现具体做了些什么)。 上面提到这种封装可以命名为“功能封装”,用以区分本章将要介绍的“数据封装”。数据封装是基于这样的理念提出的:每一个结构的定义应当包括应用于本结构的函数集以及阻止对内部的无限制访问。 数据封装的

  • 已经阅读了如何通过以下步骤使类不可变 null 我不确定我是否清楚地理解了私有构造函数和工厂方法在不变性上下文中的效用。如果我使class final,基本上就是关闭扩展它的任何其他类的所有路径。这是一种更复杂的方法吗 我见过单例模式中的私有构造函数、工厂方法,这很有意义。但是当我们谈到对象的不可变性时,当我们提到私有构造函数和静态工厂方法时,我们是否也在限制对象构造/实例化??

  • Java多线程中“私有最终对象”锁定有什么用? 就我的理解而言,我认为要使一个类成为线程安全的,我们要么使用内在锁定,要么将所有方法标记为同步的 例如,使用内在锁定的代码: } 我们可以用以下外在锁替换上面的代码: 是否建议使用上述外部锁而不是使用内部锁定使类作为线程安全?如果我的理解在这里有误,请纠正我?

  • 我已经编写了这个预期输出的代码: 输入样本: 输入乘客姓名:Priya 输入性别(M或F/m或f):F 输入年龄:61 请输入票号:140 输入票价:500.0 示例输出1: 票号:143 乘客姓名:Priya 一张票的价格: 500.0 总金额: 375.0 我必须根据我所写函数的年龄和性别来更改总量值。 我的代码: Person.java BusTicket.java TestMain.jav