java - 如何设计一个包含一些类的复杂类,以便将来在 Kotlin 中更容易扩展?

标签 java kotlin

我是 Kotlin 的初学者,我使用 Code A 来定义一个复杂的类 MDetail , 并使用代码 B 创建对象 aMDetail1 ,它可以工作。

但是如果我包含一个新的数据类,例如 ScreenDef,数据构造太糟糕了,无法扩展。在 MDetail就像代码 C 一样,所有旧代码都必须重写。

对于包含一些类的复杂类,是否有良好的数据构造?希望以后数据 build 可以轻松扩展!

代码 A

data class BluetoothDef(val Status:Boolean=false)
data class WiFiDef(val Name:String, val Status:Boolean=false)

data class MDetail (
        val _id: Long,
        val bluetooth: BluetoothDef,
        val wiFi:WiFiDef
)

代码 B

var mBluetoothDef1= BluetoothDef()
var mWiFiDef1= WiFiHelper(this).getWiFiDefFromSystem()
var aMDetail1= MDetail(7L,mBluetoothDef1,mWiFiDef1)

代码 C

data class BluetoothDef(val Status:Boolean=false)
data class WiFiDef(val Name:String, val Status:Boolean=false)
data class ScreenDef(val Name:String, val size:Long)
... 

data class MDetail (
        val _id: Long,
        val bluetooth: BluetoothDef,
        val wiFi:WiFiDef
        val aScreenDef:ScreenDef        
        ...
)

以下代码基于 s1m0nw1说,我认为将来很容易扩展。谢谢!

还有其他更好的方法吗?

版本 1 代码

interface DeviceDef

data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef

class MDetail(val _id: Long, val devices: MutableList<DeviceDef>) {
    inline fun <reified T> getDevice(): T {
        return devices.filterIsInstance(T::class.java).first()
    }
}

class UIMain : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_main)

        val btD = BluetoothDef(true)
        val wfD = WiFiDef("MyWifi")
        val xSc = ScreenDef("MyScreen", 1)
        val m = MDetail(7L, mutableListOf(btD, wfD, xSc))


        handleBluetoothDef(m.getDevice<BluetoothDef>())
        handleWiFiDef(m.getDevice<WiFiDef>())
        handleScreenDef(m.getDevice<ScreenDef>())
    }

    fun handleBluetoothDef(mBluetoothDef:BluetoothDef){ }    
    fun handleWiFiDef(mWiFiDef:WiFiDef){ }    
    fun handleScreenDef(mScreenDef:ScreenDef){ }
}

版本 2 代码(扩展)

interface DeviceDef

data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef

data class TimeLine(val Name: String): DeviceDef  //Extend

class MDetail(val _id: Long, val devices: MutableList<DeviceDef>) {
    inline fun <reified T> getDevice(): T {
        return devices.filterIsInstance(T::class.java).first()
    }
}

class UIMain : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_main)

        val btD = BluetoothDef(true)
        val wfD = WiFiDef("MyWifi")
        val xSc = ScreenDef("MyScreen", 1)

        val aTe = TimeLine("MyTimeline")  //Extend

        val m = MDetail(7L, mutableListOf(btD, wfD, xSc,aTe)) //Modified


        handleBluetoothDef(m.getDevice<BluetoothDef>())
        handleWiFiDef(m.getDevice<WiFiDef>())
        handleScreenDef(m.getDevice<ScreenDef>())

        handleTimeLine(m.getDevice<TimeLine>()) //Extend
    }

    fun handleBluetoothDef(mBluetoothDef:BluetoothDef){}    
    fun handleWiFiDef(mWiFiDef:WiFiDef){ }    
    fun handleScreenDef(mScreenDef:ScreenDef){ }           
    fun handleTimeLine(mTimeLine:TimeLine){}  //Extend

帮助

我必须用开放类替换接口(interface),因为我无法从 json 字符串 GSON 中反序列化 MDetail 对象。

但乐趣inline fun <reified T> getDevice(): T{ }不能返回正确的结果,我该如何修改?谢谢!

open class DeviceDef

data class BluetoothDef(val status:Boolean=false):  DeviceDef()
data class WiFiDef(val name:String, val status:Boolean=false) : DeviceDef()

data class MDetail(val _id: Long, val deviceList: MutableList<DeviceDef>)
{
    inline fun <reified T> getDevice(): T {        
        return deviceList.filterIsInstance(T::class.java).first()
    }
}

最佳答案

我建议执行以下操作:您的单元(Wifi、蓝牙等)应由接口(interface)抽象(至少作为标记),可以命名为 DeviceDef .

interface DeviceDef
data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef 

MDetail类可以用这些设备的变量列表来实例化,这样当新设备时不需要修改,例如ScreenDef , 被添加:

class MDetail(val _id: Long, val devices: List<DeviceDef>)

内部 MDetail ,您可以提供过滤这些设备的方法:

class MDetail(val _id: Long, val devices: List<DeviceDef>) {

    inline fun <reified T> getDevice(): T {
        return devices.filterIsInstance(T::class.java).first()
    }
}

现在,使用 WifiDef 非常简单例如:

fun main(args: Array<String>) {
    val btD = BluetoothDef()
    val wfD = WiFiDef("")
    val m = MDetail(7L, listOf(btD, wfD, ScreenDef("", 1)))
    println(m.getDevice<WiFiDef>())
}

我希望这会有所帮助。如果没有,您可能需要提供更多关于如何 MDetail 的详细信息。应该可以工作。

关于java - 如何设计一个包含一些类的复杂类,以便将来在 Kotlin 中更容易扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586213/

相关文章:

java - 具有动态构造函数参数的 Spring DI

java - 类似于Java中的Scala宏

android-studio - 如何防止在我的对象上使用 kotlin 扩展?

android - 具有上下文的无内存泄漏单例

Kotlin:无法访问伴随对象中定义的枚举

java - 写if语句时省略else有什么影响?

java - 摆脱警告?

kotlin - 对属性 setter 的方法引用

java - Firebase 自定义事件参数未显示在 Firebase Analytics 控制台中

java - Android 中 JSON 数据转日期时间