记录的私有规范构造函数

问题描述 投票:0回答:1

创建不可变的数据结构,我真的很喜欢 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记录相同的行为吗?

java scala data-structures record
1个回答
8
投票

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

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 的不可变注释感兴趣。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.