首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新不可变对象而不破坏不可变性

更新不可变对象而不破坏不可变性
EN

Stack Overflow用户
提问于 2016-04-04 20:01:53
回答 4查看 7.4K关注 0票数 4

如何在不破坏不可变性的前提下,从另一个不可变对象中更新不可变对象。类似于Scala是如何实现的,或者它们是如何在不可变库中实现的。

如何实现类似Customer.Builder.from(anotherCustomer).replaceOrder(oldOrder,newOrder).with(newName).build()

为了重用旧的对象并对所有我想要的更改进行排队,以便构建一个新的对象。

我正在使用Java。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-05 08:33:47

代码语言:javascript
复制
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);
        }
    }
}
票数 5
EN

Stack Overflow用户

发布于 2016-04-04 20:06:42

我推荐这本书的主题是:https://www.amazon.ca/Effective-Java-Edition-Joshua-Bloch/dp/0321356683

我知道更新不可变对象的最好方法是返回对象的修改副本,就像java字符串一样。

代码语言:javascript
复制
    String uppercase = "hello".toUpperCase()

我很容易用流利的打字。

代码语言:javascript
复制
    String uppercasewithoutletterL = "hello".toUpperCase().replace("L","")
票数 1
EN

Stack Overflow用户

发布于 2018-10-27 18:38:17

下面是一个小小的递归函数,它创建了一个更改的不可变函数。它重新创建包含更改的每个嵌套对象。

代码语言:javascript
复制
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; 
};

使用实例

代码语言:javascript
复制
let immutableObj = {a: {b: [{c: 'foo'}]}};

// change 'foo' to 'bar'
let newImmutableObj = changeImmutable(immutableObj, ['a', 'b', 0, 'c'], 'bar');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36411845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档