我是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
的默认值
谢谢!
答案 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)
}