Tag: 不变性

什么是J bloch使用的“失败primefaces性”以及它对不可变对象的益处?

刚刚看到下面的声明作为immutable object好处 不可变对象总是具有“失败primefaces性”(Joshua Bloch使用的术语):如果不可变对象抛出exception,它永远不会处于不合需要或不确定状态。 任何人都可以更详细地解释它,为什么会这样呢?

有效不可变对象

我想确保根据Java Memory Model正确理解’Effectively Immutable Objects’行为。 假设我们有一个可变类,我们希望将其发布为有效的不可变类: class Outworld { // This MAY be accessed by multiple threads public static volatile MutableLong published; } // This class is mutable class MutableLong { private long value; public MutableLong(long value) { this.value = value; } public void increment() { value++; } public long get() { return value; } […]

Java中的持久数据结构

有没有人知道一个库或者至少有一些关于在Java中创建和使用持久数据结构的研究? 我没有将持久性称为长期存储,而是将持久性称为不变性(参见维基百科条目 )。 我目前正在探索为持久性结构建模api的不同方法。 使用构建器似乎是一个有趣的解决方案: // create persistent instance Person p = Builder.create(Person.class) .withName(“Joe”) .withAddress(Builder.create(Address.class) .withCity(“paris”) .build()) .build(); // change persistent instance, ie create a new one Person p2 = Builder.update(p).withName(“Jack”); Person p3 = Builder.update(p) .withAddress(Builder.update(p.address()) .withCity(“Berlin”) .build) .build(); 但这仍然有点像锅炉板。 有任何想法吗?

具有ArrayList成员变量的不可变对象 – 为什么可以更改此变量?

我有一个包含各种成员变量的类。 有一个构造函数,有getter方法,但没有setter方法。 实际上,这个对象应该是不可变的。 public class Example { private ArrayList list; } 现在我注意到以下内容:当我使用getter-method获取变量列表时,我可以添加新值等等 – 我可以更改ArrayList 。 当我为下一次调用此变量的get() ,返回更改的ArrayList 。 怎么会这样? 我没有再设置它,我只是努力了! 使用String这种行为是不可能的。 那么这里的区别是什么?

如何使一个可变对象变为不可变? (不是在创作时)

我有一个用例,我需要首先创建一个(可变的)对象,在某些情况下我需要使它不可变(我不想让它在创建时不可变)。 有没有一个很好的方法来实现它? 要求是在某个时候将它从可变变为不可变,使用final将不起作用。

当程序状态不断变化时,不可变对象的有用性

我知道不可变对象总是具有相同的状态,即实际创建它们的状态。 它们的不变量是由构造函数建立的,因为它们的状态在构造之后不会改变,所以这些不变量总是保持良好状态,这就是为什么它们在multithreading环境中发布是安全的。 这一切都很好但是因为我们生活在一个动态的世界中,程序的状态不断变化,如果我们通过不可变对象构造程序的状态,这些对象会给我们带来什么好处呢?

关闭不可变变量并在多个迭代中累积值作为lambda表达式 – Java 8

Jersey客户端中的WebTarget是作为不可变对象实现的,任何更改状态的操作都会返回一个新的WebTarget。 要向其中添加查询参数(以Map出现),编写了以下代码。 public WebTarget webTarget(String path, Map queryMap) { WebTarget webTarget = client.target(this.address.getUrl()).path(path); if (queryMap != null) queryMap.entrySet().forEach(e -> webTarget.queryParam(e.getKey(), e.getValue())); return webTarget; } 这里的问题是每次调用.queryParam()返回一个新的WebTarget,而我仍然坚持如何累积,因为lambda表达式中使用的变量必须是final或implicit final,而不需要任何重新分配。 编辑 :在这种情况下,Reduce可能不是一个选项,因为WebTarget缺少减少机制,我无法从一个webtarget获取queryParam并将其设置为另一个。 如果WebTarget api有更好的支持积累,它本可以使用。 使用Jool来尝试利用本地Java 8 API中缺少的foldLeft,但由于WebTarget api缺乏对它的支持,它仍然处于最低点。 EDIT2 :foldLeft是下面的答案所建议的方式,写了一个小博客

在java中使类不可变

为了使类不可变,我能做的是: 1)让课程最终 2)不提供制定者 3)将所有变量标记为final 但是如果我的类有另一个类的另一个对象,那么somone可以改变该对象的值 class MyClass{ final int a; final OtherClass other MyClass(int a ,OtherClass other){ this.a = a; this.other = other; } int getA(){ return a; } OtherClass getOther(){ return other; } public static void main(String ags[]){ MyClass m = new Myclass(1,new OtherClass); Other o = m.getOther(); o.setSomething(xyz) ; //This is the problem […]

Google Collections(Guava Libraries):ImmutableSet / List / Map and Filtering

假设您要构建ImmutableSet / List / Map对象的副本,但过滤掉一些原始条目。 实现这一目标的一种方法如下: ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS)); 其中myObject.EQUALS是Iterables.filter()操作的谓词。 我认为这是一个非常优雅且易于阅读的实现。 但是,一个构建两个列表对象(首先通过Iterables.filter(…)调用,第二个通过ImmutableList.copyOf(…) )这是非常低效的。 有人知道更有效的方法吗? 我想最好的办法是将过滤谓词添加到ImmutableSet / List / Map构建器中,这样对象必须只构造一次。 但不幸的是,没有这样的参数。

使用reflection修改字符串的目的是什么?

我正在阅读一篇文章 ,说Java字符串不是完全不可变的。 但是,在文章的修改字符串的示例代码中,它调用string.toUpperCase()。toCharArray(),它返回一个新字符串。 那么,如果你调用toUpperCase(),那么通过更改字符串的过程的目的是什么? 这是代码: public static void toUpperCase(String orig) { try { Field stringValue = String.class.getDeclaredField(“value”); stringValue.setAccessible(true); stringValue.set(orig, orig.toUpperCase().toCharArray()); } catch (Exception ex){} } 另外,我注意到string.toUpperCase()本身不起作用。 它需要是string.toUpperCase()。toCharArray()。 是否有一个原因?