在设置值之前修改案例类构造函数参数

2024-01-11

Scala 有没有办法修改传递给单参数案例类构造函数的参数/apply()方法在成为之前val? E.g.

case class AbsVal private(aVal: Double)

object AbsVal {
    def apply(aVal: Double): AbsVal = AbsVal(Math.abs(aVal)) // doesn't compile
}

这当然会失败对重载定义的引用不明确。我想也许我可以用命名参数来欺骗它(以及构造函数和构造函数的不同参数名称)apply()),但这也不起作用。

当然不是apply()我可以只拥有私有构造函数和工厂方法,但是必须用以下代码乱扔垃圾,这很烦人AbsVal.make(x)而不是仅仅AbsVal(x).


abstract case class AbsVal private(value: Double)

object AbsVal {
  def apply(value: Double): AbsVal = new AbsVal(Math.abs(value)) {}
}

抽象案例类没有在其伴生对象中自动生成的 apply 方法。这让我们可以创建自己的。我们必须创建另一个类来继承案例类(此处为匿名),但是toString为案例类生成的方法仍会将其显示为AbsVal,所以这也应该是不可见的。 Acopy方法不会为抽象案例类自动生成,但对于像这样具有单个参数的类来说,无论如何它都没有用(并且它始终可以手动定义,请参阅 LimbSoup 的答案)。

案例类继承通常是一个坏主意 https://stackoverflow.com/questions/11158929/what-is-so-wrong-with-case-class-inheritance,但由于私有构造函数,唯一存在的子类将是我们定义的匿名子类,因此在这种情况下它是安全的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在设置值之前修改案例类构造函数参数 的相关文章

随机推荐