Tag: 不变性

如何在java中创建不可变列表?

我需要将可变列表对象转换为不可变列表,在java中可能的方式是什么。 public void action() { List mutableList = Arrays.asList(new MutableClass(“san”, “UK”, 21), new MutableClass(“peter”, “US”, 34)); List immutableList = immutateList(mutableList); } public List immutateList(List mutableList){ //some code here to make this beanList immutable //ie. objects and size of beanList should not be change. //ie. we cant add new object here. //ie. we cant remove or […]

不可变对象是否对不正当的出版物免疫?

这是JCiP的一个例子。 public class Unsafe { // Unsafe publication public Holder holder; public void initialize() { holder = new Holder(42); } } public class Holder { private int n; public Holder(int n) { this.n = n; } public void assertSanity() { if (n != n) { throw new AssertionError(“This statement is false.”); } } } 在页34: […]

不可变对象和不可修改的集合

使用不可变对象,将包含的集合包装为不可修改的位置是正确的? 我看到3个选项: 在不可变对象的工厂中: public class ImmutableFactory { public Immutable build(){ List values = new ArrayList(); values.add(1); values.add(2); values.add(3); return new Immutable(Collections.unmodifiableList(values), “hello”); } } 在immutable的构造函数中 public class Immutable { private final List values; private final String hello; public Immutable(List values, String hello) { this.values = Collections.unmodifiableList(values); this.hello = hello; } public List getValues() { return […]

FindBugs:EI_EXPOSE_REP背后的真正威胁

FindBugs引发了一个名为EI_EXPOSE_REP的错误,其描述如下: EI:可以通过返回对可变对象的引用来公开内部表示 返回对存储在对象的一个​​字段中的可变对象值的引用会公开对象的内部表示。 如果不受信任的代码访问实例,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则需要执行不同的操作。 在许多情况下,返回对象的新副本是更好的方法。 关于SO( 1,2和3 )的几个问题已经解决了如何避免这种错误,我理解这是防止不可变对象修改的开发最佳实践,但是我不清楚为什么这样的bug属于MALICIOUS_CODE类别。 这背后的真正威胁是什么? 如果这是一个恶意代码问题,攻击者几乎可以做任何他想做的事情,可变性不会是最大的问题。 如果它是一个漏洞,只有在执行了不受信任的代码时它才能被利用,而我无法看到任何这样的用例。 对此有何看法? 谢谢 !

为什么整数在Java中是不可变的?

我知道整数在Java中是不可变的。 但为什么这样设计呢? 在提出这个问题之前,我通过了其他答案: 整数是不可改变的 i ++仍在为Java中的不可变Integer工作? 为什么Java包装类是不可变的? 但我找不到强制使用Integer不变的用例。 是否存在类似String的技术原因? 字符串在网络连接,数据库URL等中用作参数。如果它是可变的,它很容易被破坏。 支持StringPool工具。 支持将字符串用作参数的类加载机制。 字符串是可变的导致加载错误的类。 我知道像AtomicInteger这样的包装器是可变的。 更新: 从谈话中,没有普遍的理由可以强制整数是不可变的。 然而,通过做不可变,它提供了答案中提到的一些奖励。 比如安德烈的这句话 缓存的可能性。 其他人正在减少全球状态 更容易multithreading

最终字段和线程安全

它是否应该是有目的不可变的java类’final’的所有字段,包括超级字段,以便是线程安全的,或者它是否足够没有修饰符方法? 假设我有一个非最终字段的POJO,其中所有字段都是某些不可变类的类型。 这个POJO有getter-setters,以及一个构造函数,它设置了一些初始值。 如果我使用敲除修饰符方法扩展此POJO,从而使其不可变,扩展类是否是线程安全的?

可变或不可变的类?

我在一些设计书中读到,不可变类提高了可伸缩性,并且尽可能地编写不可变类的良好实践。 但我认为这样不可改变的阶级会增加对象的扩散。 因此,为了提高可伸缩性,继续使用不可变类或更好的静态类(具有所有静态方法的类)是不是很好?

使用Gson反序列化ImmutableList

我正在使用相当多的不可变集合,我很好奇如何使用Gson对它们进行反序列化。 由于没有人回答我自己找到了解决方案,我正在简化问题并提出自己的答案。 我有两个问题: 如何编写一个适用于所有ImmutableList的单个Deserializer ? 如何为所有ImmutableList ?

安全发布和不可变与有效不可变的优势

我正在重新阅读Java Concurrency In Practice,我不确定我是否完全理解有关不可变性和安全发布的章节。 这本书的内容是: 任何线程都可以安全地使用不可变对象而无需额外的同步,即使不使用同步来发布它们也是如此。 我不明白的是,为什么有人(有兴趣使他的代码正确 )不安全地发布一些参考? 如果对象是不可变的,并且它是不安全地发布的,我理解获得对象引用的任何其他线程都会看到它的正确状态,因为正确的不变性提供了保证(使用final字段等)。 但是如果发布是不安全的,那么另一个线程可能仍然会在发布之后看到null或者先前的引用,而不是对不可变对象的引用,这在我看来就像没有人想要的那样。 如果使用安全发布来确保所有线程都能看到新引用,那么即使对象实际上是不可变的 (没有final字段,但也无法将它们静音),那么一切都是安全的。 正如书中所说: 安全发布的有效不可变对象可以被任何线程安全地使用而无需额外的同步。 那么,为什么不变性(与有效不变性相比)如此重要? 在什么情况下需要不安全的出版物?

为什么最终关键字对于不可变类是必要的?

您能否澄清一下,为什么在课堂上我们将最终关键字作为不可变关键字时需要它。 我的意思是,如果我们将所有属性声明为private和final,那么它也是一个不可变类,不是吗? 对不起,如果问题看似简单,但我真的很困惑。 帮帮我。 编辑:我知道一个声明为final的类不能被子类化。但是如果每个属性都是私有的,那么最终会有什么区别呢?