2017-02-19 8 views
-1

私はscalaを使い慣れていないので、デフォルト以外の値で初期化するためには、たった数個の変数(時にはnone)しか必要としないクラスがあります。最初はビルダークラスを使用してこれを行いましたが、その後、コンストラクターでスカラーのデフォルト値を使用する方が優れていることに気付きました。問題は、それはかなりひどい見えますが、それは上で一意の名前の要件を満たすように、デフォルト値のいくつかは、Scala:単純でないデフォルト値の使い方

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

オクラホマのように、もう少し複雑なString = "name"またはInt = 1などよりますと、実際のコードを必要とすることですその変数とそれが動作します。

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 これらの変数には、以前に初期化された変数を共有するために1行を使用することはできません。

ありがとうございます!

+1

あなたの質問は不明です。 「明らかに、すべてのコードを 'startDate'のデフォルト値として使うことはできませんが、これについては何も明白ではありません。私はこれが宿題であると推測しています。変数を初期化するために複合式を使用することが許可されていないという制約がいくつかあります。またはあなたの会社のスタイルのガイドはそれを禁じますか?いずれにしても、それらの制限は、決して「明白」ではないため、*正確に*これらの制限が何であるかを質問する*必要があります。 –

+0

十分に公正で、私は私の質問を更新しました。もちろん、私は上記のように別の変数を使用して複合式を使用することは可能ですが、それを行うより良い方法があるように感じるのは、私ができなければビルダーを使用しなければならないからです。 1つの変数の –

答えて

1

私はあなたが間違った方法でそれを見ていると思う:getOrElseへのパラメータは、このように、ブロックすることができます。 Scalaは強力な型言語です。したがって、すべてを型として使用するベストプラクティスは、ケースクラスを作成するだけです。あなたの長い文字列の例では、 PartyEpocを作成します。この場合、デフォルトでこの値があります。それ以外の場合はinitになります。

+0

ありがとう、これは明らかに何かが欠けていたので意味があります。 –

-1

デフォルト値で何かを初期化するためにvarを使用しないでください。変異は全般的に推奨されません。

"実際の"値にOptionをよく使用し、getOrElseを使用して、 "実際の"値が利用できない場合はデフォルトに戻します。

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

表示されるコードはBuilderクラスの一部なので、varを使用する必要があります。また、これは私の質問には答えません –

+1

@EladStern varはビルダーには必要ありません。メソッド呼び出しのたびに新しいオブジェクトを返すことができます。 – Kolmar

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を初期化する必要があり、最初に使用する場合、他の変数が適切に初期化されます。

関連する問題