我来自.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
一样。
答案 0 :(得分:5)
问:我们如何拥有非静态字段的静态类?
static
修饰符在C#和Java中意味着不同的东西。
在C#中,这意味着该类无法实例化或子类化。它基本上使该类成为static
成员的容器。
在Java中,类上的static
修饰符意味着它不会对外部类的实例进行隐式引用。
Docs:
与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,因为内部类与实例相关联,所以它本身不能定义任何静态成员。
问:本书的作者正在写这样的东西:通过使用构建器作为可变对象,可以确保
Order
数据成员的不变性,以便更容易并发强>
构建器是可变的,但构建的实际对象是不可变的(C#中的所有字段都是final
== readonly
。
当一个对象是不可变的时,它本身就是线程安全的:你可以一次在多个线程中使用它而不需要锁定,因为它保证所有这些线程只会对对象执行读操作。不需要同步意味着更容易并发。