2017-06-10 86 views
2

我有幾個數據類,那就是簡短的,所以我把它們放在一個文件中。Kotlin:使用對象的範圍對類

我可以定義他們在科特林文件,因爲它是,但我們更希望它是一類/對象之內的範圍,因此該文件不只是一個文件,但爲了更好的分組下類/對象

我可以做

object Model { 
    data class Result(val query: Query) 
    data class Query(val searchinfo: SearchInfo) 
    data class SearchInfo(val totalhits: Int) 
} 

,我也可以做

class Model { 
    data class Result(val query: Query) 
    data class Query(val searchinfo: SearchInfo) 
    data class SearchInfo(val totalhits: Int) 
} 

他們都看起來是一樣的我。有什麼不同,如果在確定我的數據類方面有一個首選方法?

回答

0

另一種選擇是將所有數據類都作爲密封的Model類的子類。這將給你在一個地方定義它們的好處,因爲Kotlin爲密封類強制執行。此外,使類型系統知道類型Model的所有實例在when表達式中也有幫助,因爲那樣它不會要求您輸入else ->塊。

sealed class Model 
data class Result(val query: Query) : Model() 
data class Query(val searchinfo: SearchInfo) : Model() 
data class SearchInfo(val totalhits: Int) : Model() 

而且你可以直接使用它們:

val r = Result(Query(SearchInfo(3)) 

而是在另一個classobject,包裝他們,你不得不提到他們是這樣的:

val r = Model.Result(Model.Query(Model.SearchInfo(3))) 
2

我建議不要使用類來確定其他類的範圍。正如託德在他的回答中解釋的那樣,你可以使用密封的課程,其實際效益爲exhaustive when checks。如果不需要此功能,科特林有範圍界定一個內置的機制 - 包:

package org.company.model 

data class Result(val query: Query) 
data class Query(val searchinfo: SearchInfo) 
data class SearchInfo(val totalhits: Int) 

我可以定義他們在科特林文件,因爲它是,但我們更希望它是範圍之內一個類/對象,因此該文件不僅僅是一個文件,而是在類/對象下更好地分組。

包含多個頂級元素的文件沒有任何問題。這是一種有用的語言功能,正是用於這種情況。

+0

嗨基里爾,謝謝你的答案。我同意,將它作爲最高級別沒有問題。但是,我正在使用Retrofit 2和proguard,一些proguard會如何混淆它導致編譯錯誤,所以我將其範圍o我可以保持類按照https://stackoverflow.com/a/44473703/3286489沒有需要單獨保存它們 – Elye

+1

如果您將模型類放在子包中,則可以指示ProGuard保留該子包。 –