[英]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.