繁体   English   中英

如何在JAVA中使返回值不变

[英]How to make the return immutable in JAVA

我有一个物体,例如

public class ABC {

    private String a;
    private String b;
    private String c;

    //getters and setters    
}

从集合中的方法(例如ArrayList<ABC> )返回此对象。

我只想使返回值不变,而不更改对象中的任何内容。 谁能帮我这个忙吗?

不要提供设置器(变量),不可变属性设为私有,仅通过构造函数提供值分配。

您始终可以将不可变属性声明为final 因此,您只能为它们分配一次值,以后不能更改它们。

仅使用吸气剂使用接口

A是您的具体(简单)课程

编码接口?

public I getA(){ retrun AImpl();}

哪里

public interface I { public String getOne()}
public AImple implements I {...}

当前类中唯一的“更改”将是“实现I”

JDK和Apache Commons使用修饰符

http://grepcode.com/file/repository.jboss.org/nexus/content/repositories/releases/org.jboss.embedded/thirdparty-all/beta3.SP15/org/apache/commons/collections/list/UnmodifiableList。 java的

另一种解决方案

克隆您的对象并返回它,这样就可以更改副本并且原始对象保持不变

如果对象的类提供了突变,则不能使该对象不变。 对象始终提供其类定义的所有功能。

因此,如果您想要一个不可变的对象,那么就需要一个不可变的类。 如果您不能更改所讨论的类,则描述的包装器类(如@duffymo)可以达到此目的。 但是请注意,此类的对象不能与包装类的对象互换,并且还需要以某种方式为应用包装提供条件。

如果您需要与ABC类的对象完全可互换的对象,那么您将坚持ABC是可变的这一事实,因此,至少在ABC的可变方面,任何与ABC互换的对象都是可变的。 然后归结为您为什么想要不变性。 如果要避免改变List引用的对象,则可以选择复制这些对象(适当的深度)。

作为第三种选择,如果目标类没有非私有字段,则您可以创建一个子类,覆盖设置器以使其无效或引发各种未经检查的异常。 在这种情况下,请注意

  1. 这样的子类不是很好的形式,并且其实例不能与ABC类的实例真正互换。
  2. 如果ABC类具有可变类型(例如可变容器)的可访问属性,那么您可能还需要做一些事情来防止这些对象发生突变。 递归。
  3. 是的,这真是一团糟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM