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
。
Q:如何让静态类具有非静态字段?
static
修饰符在c#和Java中的含义不同。
在c#中,它意味着类不能被实例化或子类化。它基本上使类成为static
成员的容器。
在Java中,类的static
修饰符意味着它不会有对外部类实例的隐式引用。
文档:
与实例方法和变量一样,内部类与其外围类的实例相关联,并且可以直接访问该对象的方法和字段。而且,由于内部类与实例相关联,因此它本身不能定义任何静态成员。
Q:这本书的作者是这样写的:通过使用构建器作为可变对象,可以确保
Order
数据成员的不可变性,从而更容易实现并发性。
构建器是可变的,但实际构建的对象是不可变的(它的所有字段在c#中都是final
== readonly
)。
当一个对象是不可变的,它本质上是线程安全的:你可以一次在几个线程中使用它而不需要锁,因为它保证了所有这些线程只对这个对象执行读操作。不需要同步意味着更容易并发。