Scala:如何使用非简单的默认值?

时间:2017-02-19 09:03:49

标签: scala default-value

我是scala的新手,我有一个类,通常只需要使用非默认值初始化一些变量(有时没有)。最初我使用了一个构建器类来执行此操作,但后来意识到使用构造函数中的scala默认值可以更好地完成。问题是某些默认值比String = "name"Int = 1等稍微复杂一些,需要实际代码,例如

val name: String = "Party-" + LocalDateTime.now.atZone(ZoneId.systemDefault()).toEpochSecond

好的,所以看起来非常糟糕,但它会满足该变量的唯一名称要求而且有效。

我有其他需要格式化日期的变量,默认值需要从今天开始,这将满足:

private val now: LocalDateTime = LocalDateTime.now()
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private var startDate = dateFormat.format(now)
private var startHour = now.getHour

所以显然我不能将所有代码用作startDate的默认值我不能对这两个变量使用单行,因为它们共享先前初始化的变量那么我该如何实现呢?

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为你正在以错误的方式看待它。 Scala是一种强大的语言。因此,将所有内容用作类型的最佳实践,只需创建一个案例类。对于长字符串中的示例。创建一个PartyEpoc,在这种情况下类ctor - 默认情况下具有此值,否则将初始化为其他

答案 1 :(得分:0)

不确定这是否适合您的使用案例,但是懒惰的值会解决您的问题吗?

private val now: LocalDateTime = LocalDateTime.now()
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
private lazy val startDate = dateFormat.format(now)
private lazy val startHour = now.getHour

然后你只需要在对象构造时初始化now,其他变量在首次使用时将被正确初始化。

答案 2 :(得分:-1)

请勿使用var初始化具有默认值的内容。一般不鼓励变通。

最好在“真实”值上使用Option,如果“真实”值不可用,请执行getOrElse以恢复默认值。 getOrElse的参数可以是一个块,如下所示:

myReal.getOrElse {
  val now: LocalDateTime = LocalDateTime.now()
  val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
  dateFormat.format(now)
}