Java Builder模式实现与c#的对比

本文关键字:Builder 模式 实现 Java | 更新日期: 2023-09-27 18:17:14

我来自。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

Java Builder模式实现与c#的对比

Q:如何让静态类具有非静态字段?

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

在c#中,它意味着类不能被实例化或子类化。它基本上使类成为static成员的容器。

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

文档:

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

Q:这本书的作者是这样写的:通过使用构建器作为可变对象,可以确保Order数据成员的不可变性,从而更容易实现并发性

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

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