Scala中的通用工厂(?)模式

时间:2016-08-21 22:20:02

标签: scala

我有一个通用类:

class SomeValue[T](private val value: T) {
  override def toString = value.toString
}

在我的应用程序中,我将使用这个类的特定结构:

val five = new SomeValue[Int](5) // doing this a lot
assert(five.toString == "5")

这非常冗长,容易出现拼写错误(例如偶然将其设置为6)。为了解决这个问题,我想创建一个掩盖这种模式的类:

class Five { ... }

所以我现在可以这样做:

val five = new Five
assert(five.toString == "5")

我知道一种愚蠢的例子,但希望你能得到这张照片!

3 个答案:

答案 0 :(得分:3)

看起来你正在构建常量,因此我建议使用Scala objects

e.g。

object Main extends App {
  assert(Five.toString == "5")
  assert(Hello.toString == "hello")
}

class SomeValue[T](private val value: T) {
  override def toString = value.toString
}

object Five extends SomeValue[Int](5)
object Hello extends SomeValue[String]("hello")

答案 1 :(得分:1)

为什么不定义一个方法而不是一个全新的类?

class SomeValue[T](private val value: T) { ... }
object SomeValue {
  // since the class appears to be immutable, it could also be a val
  def five = new SomeValue(5)
}

// elsewhere
SomeValue.five

当然,如果需要,此方法可以具有参数和类型参数(例如,仅修复一些构造函数参数)。

答案 2 :(得分:0)

在发布我的问题之后想出了这个。

class Five extends SomeValue[Int](value = 5) {}

似乎没错,但任何人都可以确认吗?