2017-07-11 25 views
3

我有一個數據類一個字段可以轉換爲非null版本嗎?

data class MyModel(private val _data: MyData? = null) 

我想確保我的數據是唯一的訪問,當它不爲空,否則拋出。 我使用下面這是很好的。

fun getData(): MyData { 
     return checkNotNull(_data) { "data shouldn't be null" } 
    } 

但是,如果我跟着導遊按Override getter for Kotlin data class,下面的人抱怨,所以需要返回MyData?而不是MyData

val data = _data 
    get(): MyData { 
     return checkNotNull(field) { "data shouldn't be null" } 
    } 

難道field不能轉換到非它返回時的空版本?

回答

2

如果您的目標是爲Any?屬性聲明一個吸氣劑,並返回Any,那麼這是不可能的。您會收到以下錯誤:

Getter return type must be equal to the type of the property

所以試圖做類似

val test : String? 
    get() : String = "hi" 

是行不通的。


但是,你可以隱藏的可爲空屬性和揭露其通過鑄造引用空值非空的屬性:

private val test : String? = "hi" 
val testNotNull : String = test as String 

如果test引用null,一個異常將被拋出。

例如:

fun main(args: Array<String>) = print(Demo().testNotNull) 

class Demo(private var test: String? = "hi") { 
    val testNotNull : String 
.  get() = test as String 
} 

您可以測試這個SNIPPIT出在try.kotlin.org

雖然這不是安全的。你應該重新考慮你的設計。如果你沒有和Java互通,你不應該用可爲空的類型來懲罰你自己。

+0

對於一個正常的變量,這是可能的。對於字段,請嘗試「字段爲字符串」,這不是幫助。做一個類變量自定義getter測試,你會明白我的意思。 – Elye

+0

@Elye也適用於領域。看看我的更新。 –

+0

嗨@Vince,那不是'field'。這只是從另一個變量投射到它。但這也是一個很好的竅門。 Upvote for you as well :) – Elye

0

這並不一定意味着MyData的類爲null,如果你投它像MyData?

的「'只允許對象在實際變爲空的情況下爲空,以避免運行時出現異常。

你可以讓你的類可以爲空,它仍然可以包含你的數據。

+0

調用getData()的函數需要一個非空項目。所以我們需要確保它不是null。我不想傳播?一直到來電者。我也不想用「!!」。 – Elye

+0

啊,我看到我錯過了我的手機對不起 – ganjeii

1

我不認爲你可以。你對fun getData()所做的是一個有效的IMO方法。或者你可以不使用數據類,並創建一個普通的類,顯然。

我覺得它可能工作是這樣的:

typealias notNullType = MyData 

data class Test(private val _value: MyData? = null) { 
    val v: notNullType = _value as notNullType 
    get() { return field } 
} 

這將完全允許你這樣做:

fun play() { 
    val t = Test(null) 
    print(t.v) //see what I did? :-) 
} 

話雖這麼說 ...我不認爲「隱藏「?可選是一個好主意。

+1

好戲。但即使只是'val t = Test(null)',它也會崩潰。也許在這種情況下,回到上面列出的使用'getData()'方法的基本方法。給你upvote雖然:) – Elye

+0

那麼,問題是,你試圖隱藏一個字段爲空的事實。這打破了它開始的'?'的承諾,這反過來又打開了你提到的崩潰的大門。如果你想在data類中使用「自定義邏輯」,你必須添加它(你的'getData()'函數就是一個很好的例子),否則你試圖覆蓋編譯器的檢查機制,這就是'!'是爲...(再一次,我不會);) –

+0

我不打算隱藏「?」,但只是在它訪問它時爲空,例如'checkNotNull(field){「data不應該爲空「}」。如果不能訪問,那麼沒關係,不要崩潰。 – Elye

相關問題