【问题标题】:Scala: How to use non-simple default values?Scala:如何使用非简单的默认值?
【发布时间】:2017-07-08 14:24:52
【问题描述】:

我是 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的默认值我不能对这两个变量使用一行,因为它们共享一个先前初始化的变量,所以我应该如何实施?

谢谢!

【问题讨论】:

  • 您的问题不清楚。您说“显然我不能将所有代码用作startDate 的默认值”,但这一点也不明显。我猜这是作业,并且有一些限制说您不允许使用复合表达式来初始化变量?还是您的公司风格指南禁止这样做?无论哪种方式,您都需要在问题中告诉我们这些限制是什么确切,因为它们绝不是“显而易见的”。
  • 很公平,我更新了我的问题。当然可以使用复合表达式,正如我上面所说的使用不同的变量,我只是觉得可能有更好的方法来做到这一点,因为如果我不能,那么我不得不使用构建器,因为单个变量。

标签: scala default-value


【解决方案1】:

我认为你看错了。 Scala 是一种强类型语言。所以最好的做法是将所有东西都用作类型,所以只需创建一个案例类。对于您在长字符串中的示例。创建一个 PartyEpoc,在这种情况下为类 ctor - 默认情况下具有此值,否则将初始化为其他内容

【讨论】:

  • 谢谢,这是有道理的,因为我显然遗漏了一些东西。
【解决方案2】:

不确定这是否适合您的用例,但惰性值能否解决您的问题?

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,其他变量在第一次使用的时候就会正确初始化。

【讨论】:

    【解决方案3】:

    不要使用var 来初始化具有默认值的东西。通常不鼓励可变性。

    最好在“真实”值上使用Option,如果“真实”值不可用,则使用getOrElse 回退到默认值。 getOrElse 的参数可以是一个块,像这样:

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

    【讨论】:

    • 您看到的代码是构建器类的一部分,因此需要使用 var。另外,这并不能回答我的问题
    • @EladStern var 对于构建者来说不是必需的。您可以在每次方法调用后返回一个新对象。
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 2012-08-01
    • 1970-01-01
    • 2012-05-15
    • 2011-04-08
    • 2016-05-08
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多