创建不可变的数据结构,我真的很喜欢 Scala 的概念,您可以使用 case 类(具有私有规范构造函数)和伴随对象,通过工厂方法仅强制执行对象实例化。
final case class Foo private(a: Int)
object Foo {
def apply(left: Int, right: Int) = Foo(left + right)
}
在 Java 14 中,引入了 records 的概念,提供了 Scala 的大部分案例类功能。 然而,制作记录的规范构造函数
private
似乎有点麻烦...有什么方法可以实现与Java记录相同的行为吗?
如果您想在工厂方法中进行一些健全性检查(或其他添加),您可以使用记录的紧凑构造函数(即没有参数部分的构造函数)。例如:
record HelloWorld(String message) {
public HelloWorld {
java.util.Objects.requireNonNull(message);
}
}
通过它不会隐藏规范构造函数,但它会用提供的代码“附加”它(健全性检查,自动注册,...)
Record 无法隐藏其规范构造函数,就像 scala 中的 case 类一样。 “java”执行此操作的方法是使用带有私有构造函数的类:
public class Foo {
private final Integer a;
private Foo(Integer a) {
this.a = a;
}
public Foo of(Integer left, Integer right) {
return new Foo(left + right);
}
}
通过使用固定的 lombok 库,您可以将样板降低到 scala 级别:
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class Foo {
private final Integer a;
public Foo of(Integer left, Integer right) {
return new Foo(left + right);
}
}
如果您已经在使用 lombok,您可能对其名为 @Value 的不可变注释感兴趣。