繁体   English   中英

Java Builder模式实现与C#

[英]Java Builder pattern implementation versus C#

我来自.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.我们如何拥有带有非静态字段的静态类? 2.本书的作者正在写这样的东西:通过使用构建器作为可变对象,可以确保Order数据成员的不变性,从而更轻松地进行并发

有人可以给我一个例子吗,一旦我们仍然拥有可变的构建器对象,它如何实际上可以简化并发问题,该对象将具有相同的并发问题,就像我们具有可变的Order

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

static修饰符在C#和Java中的含义不同。

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

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

文件

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

问:本书的作者正在写这样的东西:通过将构建器用作可变对象,可以确保Order数据成员的不变性,从而更轻松地实现并发

生成器是可变的,但生成的实际对象是不可变的(其所有字段在C#中均为final == readonly )。

当一个对象是不可变的时,它本质上是线程安全的:您可以一次在多个线程中使用它而无需锁定,因为可以保证所有这些线程仅对对象执行读取。 无需同步意味着更轻松的并发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM