2017-10-06 83 views
0

想,我有一個類以下結構的可空參數科特林師

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

ab被設置在其他地方,而如果參數中至少有一個是c應計算爲a/bnullnull。有沒有一種簡單的方法可以在Kotlin中實現這一點?

我現在要做的是通過以下方式:

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

你檢索'''你在傳遞'a'和'b'的代碼/方法中使用'c'? – elect

+0

確保b不等於0 –

回答

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

當然,這可以作爲C(這又避免了存儲C作爲場)的吸氣劑:

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()

如果您需要在計算a/b時確定可空性,則應該按照指示使用臨時變量在@Joshua回答如下。或者也可以參考下面的科特林討論:https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11和票務: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'不能爲空。 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

不完全是我想要的 - 該類應該只保存數據,而不是業務邏輯,並且還有7行額外的代碼 – ekaerovets

+0

@ekaerovets如果'c'總是從'a'和「b」,那麼它應該被視爲數據之一。另外,如果你想減少行數,最好的解決方案是不使用空值。 – Joshua

+0

這是客戶數據,他們可以很容易地爲空。我不想在類中計算c,因爲有些字段需要來自其他類的數據 - 所以我更願意在一個單獨的服務中計算Test類的所有字段。糟糕的語言設計不允許像/? – ekaerovets

0

由於邏輯是Test類以外我不覺得做術前檢查爲空的問題。無論如何,if else也是科特林的表達,所以你能做到以下幾點:

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

這樣的擴展。這就是我現在要做的。問題是一個非常簡單的操作需要2個額外的變量和3行代碼。 – ekaerovets