记录的私有规范构造函数

Chr*_*ris 27 java scala record data-structures

创建不可变的数据结构,我真的很喜欢 Scala 的概念,您可以使用案例类(具有私有规范构造函数)和伴随对象,以这种方式仅通过工厂方法强制对象实例化。

final case class Foo private(a: Int)

object Foo {
  def apply(left: Int, right: Int) = Foo(left + right)
}
Run Code Online (Sandbox Code Playgroud)

Java 14 中引入了记录的概念,提供了 Scala 的大部分案例类功能。然而,制作记录的规范构造函数private似乎有点麻烦......有没有办法用Java的记录实现相同的行为?

Lub*_*ubo 9

如果您想在工厂方法中进行一些健全性检查(或其他添加),您可以使用记录的紧凑构造函数(即不带参数部分的构造函数)。例如:

record HelloWorld(String message) {
    public HelloWorld {
        java.util.Objects.requireNonNull(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过它不会隐藏规范的构造函数,但它会用提供的代码“附加”它(健全性检查,自动注册,...)

Record 无法隐藏其规范构造函数,就像 scala 中的 case 类一样。“java”方法是使用带有私有构造函数的类

public class Foo private {
    private final Integer a;
    private Foo(Integer a) {
        this.a = a;
    }
    public Foo of(Integer left, Integer right) {
        return new Foo(left + right);
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用固定的 lombok 库,您可以将样板降低到 scala 级别:

@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class Foo private {
    private final Integer a;

    public Foo of(Integer left, Integer right) {
        return new Foo(left + right);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您已经在使用 lombok,您可能对其名为@Value的不可变注释感兴趣。