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

您可以采取哪些步骤来使一个带有setter的Java对象变得不可变?[副本]

计胤
2023-03-14

你能做什么使像这样的对象是不可变的?我主要关心的是解决public void someMethod(SomeObject SomeObject){}<==本例

例如:

public class SomeObject {
   private String someString;

   public void setSomeString(String someString) {
      this.someString = someString;
   }
   public void getSomeString() {
      return someString;
   }
}


public void someMethod() {
   final SomeObject someObject = new SomeObject();
   someObject.set("Want to prevent this"); // <-- SomeObject is mutable in this case
}

public void someMethod(SomeObject someObject) {
   someObject.set("And prevent this!"); // <-- And so is this
}

共有1个答案

叶声
2023-03-14

您是对的,声明一个对象final并不能使其不可变。它所做的只是防止final变量被重新分配一个新的对象,但是如果它的变异方法可用,那么已经被分配给它的对象可能会被变异。

您可以为对象提供一个不可变的接口,并对该接口进行编程:

interface ImmutableCar {
    String getMake();
    String getModel();
}
class Car implements ImmutableCar {
    public Car(String make, String model) {
        this.make = make;
        this.model = model;
    }
    private String make;
    private String model;
    public String getMake() { return make; }
    public void setMake(String m) { make = m; }
    public String getModel() { return model; }
    public void setModel(String m) { model = m; }
}

如果你这样做

ImmutableCar car = new Car("VW", "Bora");

如果没有显式强制转换,您将无法访问突变方法。当然,这不会使对象真正变得不可变,因为强制转换仍然是一种可能性,但人们可以认为,通过反射可以更改其他不可变对象,因此这种方法只允许您公开不可变的行为。

 类似资料:
  • 我的目标是让Java对象不可变。我有一个班级< code >学生。为了实现不变性,我用以下方式对它进行了编码: 我的问题是,实现班级不变性的最佳方法是什么?

  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改

  • 问题内容: 代码段-1 代码段-2 我在第一个代码段中遇到了竞争。我知道这是因为我正在获得对不可变对象(类型为Integer)的锁定。 我已经写了第二个代码片段,这再次使“布尔”不变。但这有效(输出运行中不显示竞争条件)。如果我正确理解了上一个问题的解决方案,则以下是出现问题的一种可能方法 线程1锁定由指向的对象(例如A) 线程2现在试图获取由指向的对象的锁,并进入A的等待队列。 线程1进入同步块

  • 我想确保我正确理解根据Java内存模型的‘有效不可变对象’行为。 假设我们有一个可变类,我们希望将它发布为一个有效不可变的类: 我们执行以下操作: 问题是:Java内存模型是否保证所有线程必须具有? 根据Java并发实践,这应该是正确的,但如果我错了,请纠正我。 3.5.3.安全发布习语 要安全地发布对象,必须同时使对对象的引用和对象的状态对其他线程可见。通过以下方法可以安全地发布正确构造的对象:

  • 问题内容: 这是Java Concurrency in Practice中的一句话 共享的只读对象包括不可变的和实际上不可变的对象。 不变对象和有效不变对象之间有什么区别? 问题答案: 不可扩展且其字段全部为自身且不可变的类的实例是不可变的。 由于其方法的详细信息而无法更改其字段的类的实例实际上是不可变的。例如: 的某些实例实际上是不可变的,而有些则不是。 另一个例子是零长度数组。它们实际上是不可

  • 下面是一个不可变类的示例: 下面是类的实现: 当我创建的实例时,我正在的构造函数中对进行深度复制,但是我能够通过更新的值,这种方法破坏了my类的不变性。我在这里做错了什么?