2017-10-06 16 views
0

と仮定、私はkotlin部門

class Test { 
    var a: Double? = null 
    var b: Double? = null; 
    var c: Double? = null; 
} 

abがどこかに設定されている次のような構造のクラスを持っている、と引数の少なくとも一方がある場合ca/bまたはnullのように計算されなければなりませんnull。 Kotlinでこれを達成する簡単な方法はありますか?

私は今、それを次のように行う必要があります。

fun calculateValues() { 
    ... 
    val a = test.a 
    val b = test.b 
    if (a != null && b != null) 
    test.c = a/b 
    ... 
} 
+0

あなたが取得してください'c'を' a'と 'b'を渡すのと同じコード/メソッドに入れていますか? 'C'は常にA' 'から計算する場合には、ビジネスロジックは、クラスはデータのみを保持することになっていない、とのコードのさらに7余分な行 – elect

+0

は、bが、私が望んでいた、まさに未 –

答えて

0
test.apply { 
    c = if (a==null || b==null) null else a/b 
} 

:あなたは次の操作を行うことができるようにとにかく、if elseはKotlinにおける発現もある

class Test { 
    var a: Double? = null 
    var b: Double? = null 
    var c: Double? = null 
    get() = if (a==null || b==null) null else a/b 
} 

テストは、あなたのクラスではない場合、あなたは常に拡張機能を使用することができます。

fun Test.updateC() { 
    c = if (a==null || b==null) null else a/b 
} 

およびそのそしてちょうどテストクラスの他の関数と同様にテストインスタンス上で呼び出すことができます。test.updateC()

あなたが/ bを計算する時にNULL値を許可するかどうかについて確認する必要があります場合は示されているように、あなたは一時的な変数を使用する必要があります@ジョシュアの答えは以下の通りです。 https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11チケット:または、以下Kotlinディスカッション読みhttps://youtrack.jetbrains.com/issue/KT-20294

を私は特に機能を備えた再利用可能な解決策のように:のように使用することができます

fun notNull(vararg args: Any?, action:() -> Unit) { 
    when { 
     args.filterNotNull().size == args.size -> action() 
    } 
} 

c = null 
notNull(a, b) { c = a/b } 
+1

'a == null'と' b == null'をチェックすると、 'a/b'のときにnullにすることはできません。 IDEは、それらが変更可能であることを警告していたはずです。あなたがそれらにアクセスする時間は、値が同じであることを保証するものではありません。 – Joshua

+0

あなたの答えにリンクしています。こちらもご覧ください:https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11 –

2
class Test { 
    var a: Double? = null 
    var b: Double? = null 
    val c: Double? // It should be val as it is readonly 
     get() { 
      // This is need as a & b are mutable 
      val dividend = a 
      val divisor = b 
      if (dividend == null || divisor == null) 
       return null 
      return dividend/divisor 
     } 
} 
+0

0に等しいではないことを確認してください「b」のみの場合は、データの1つとして考慮する必要があります。また、行数を減らしたい場合は、最適な解決法ではnullを使用できません。 – ekaerovets

+0

@ekaerovets - – Joshua

+0

は顧客データであり、簡単にnullを指定できます。いくつかのフィールドがあり、別のクラスのデータが必要なので、クラスそのもののcを計算したくないので、クラスTestのすべてのフィールドを別のサービスで計算する方が好きです。あまりにも言語設計が/のようなものを許さないのは悪いですか? – ekaerovets

0

ロジックは、私が操作を行う前にnull値を許可を確認する問題を見つけることができませんTestクラスの外にあるとして。 (順番にフィールドとして保存するCを回避し)、Cのゲッターとして含めることができる。もちろん、

val a = test.a 
val b = test.b 
t.c = if (a != null && b != null) a/b else null 
+0

これは私が今やっていることです。問題は、かなり簡単な操作では2つの余分な変数と3行のコードが必要になることです。 – ekaerovets