Java Builder模式实现与C#

时间:2015-10-11 18:10:19

标签: java c# design-patterns concurrency builder

我来自.NET世界,但现在我正在读一本书,所有的例子都是用Java编写的。这是代码片段:

public class Order {
    static class Builder {
        private String security;
        private int quantity;

        public Builder() {}

        public Builder buy(int quantity, String security) {
            this.security = security;
            this.quantity = quantity;
        }

        // some other builder pattern methods...

        public Order build() {
            return new Order(this);
        }
    }

    private final String security;
    private final int quantity;

    private Order(Builder b) {
        security = b.security;
        quantity = b.quantity;
    }
}

所以,如果有人能解释我: 1.我们如何使用具有非静态字段的静态类? 这本书的作者写的是这样的东西: 通过将构建器用作可变对象,可以确保Order数据成员的不变性,以便更容易并发

有人可以给我一个例子,一旦我们仍然有可变的构建器对象,它会如何实际简化并发问题,这会产生相同的并发问题,就像我们可变的Order一样。

1 个答案:

答案 0 :(得分:5)

  

问:我们如何拥有非静态字段的静态类?

static修饰符在C#和Java中意味着不同的东西。

在C#中,这意味着该类无法实例化或子类化。它基本上使该类成为static成员的容器。

在Java中,类上的static修饰符意味着它不会对外部类的实例进行隐式引用。

Docs

  

与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,因为内部类与实例相关联,所以它本身不能定义任何静态成员。

  

问:本书的作者正在写这样的东西:通过使用构建器作为可变对象,可以确保Order数据成员的不变性,以便更容易并发

构建器是可变的,但构建的实际对象是不可变的(C#中的所有字段都是final == readonly

当一个对象是不可变的时,它本身就是线程安全的:你可以一次在多个线程中使用它而不需要锁定,因为它保证所有这些线程只会对对象执行读操作。不需要同步意味着更容易并发。