如何在不破坏不可变性的前提下,从另一个不可变对象中更新不可变对象。类似于Scala是如何实现的,或者它们是如何在不可变库中实现的。
如何实现类似Customer.Builder.from(anotherCustomer).replaceOrder(oldOrder,newOrder).with(newName).build()
为了重用旧的对象并对所有我想要的更改进行排队,以便构建一个新的对象。
我正在使用Java。
发布于 2016-04-05 08:33:47
public class Customer {
private String name;
private Order order
private Customer(CustomerBuilder builder) {
this.name = builder.name;
this.order = builder.order;
}
public Customer replace(Order order) {
return new CustomerBuilder().name(this.name).order(order).build();
}
public static class CustomerBuilder {
private String name;
private Order order
public CustomerBuilder name(String name) {
this.name = name;
return this;
}
public CustomerBuilder order(Order order) {
this.order = order;
return this;
}
public Customer build() {
return new Customer(this);
}
}
}发布于 2016-04-04 20:06:42
我推荐这本书的主题是:https://www.amazon.ca/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
我知道更新不可变对象的最好方法是返回对象的修改副本,就像java字符串一样。
String uppercase = "hello".toUpperCase()我很容易用流利的打字。
String uppercasewithoutletterL = "hello".toUpperCase().replace("L","")发布于 2018-10-27 18:38:17
下面是一个小小的递归函数,它创建了一个更改的不可变函数。它重新创建包含更改的每个嵌套对象。
const changeImmutable = (immutable: any, path: string[], newVal: any): any => {
if(path.length) {
let copy = Array.isArray(immutable) ? [...immutable] : {...immutable};
copy[path[0]] = changeImmutable(copy[path[0]], path.slice(1), newVal);
return copy;
}
return newVal;
};使用实例
let immutableObj = {a: {b: [{c: 'foo'}]}};
// change 'foo' to 'bar'
let newImmutableObj = changeImmutable(immutableObj, ['a', 'b', 0, 'c'], 'bar');https://stackoverflow.com/questions/36411845
复制相似问题