在 Kotlin 中設計一個通用的 ControlParams 類來處理不同的控制參數,有幾種常見的方法:方案1:使用密封類(Sealed Class)
sealed class ControlParamsdata class LightControlParams(val brightness: Int,val color: String
) : ControlParams()data class ThermostatControlParams(val temperature: Double,val mode: String
) : ControlParams()data class GenericControlParams(val parameters: Map<String, Any>
) : ControlParams()
方案2:使用泛型和類型參數
data class DeviceControlBody<T: ControlParams>(val timestamp: String,val deviceId: String,val params: T
)interface ControlParamsdata class LightParams(val on: Boolean,val brightness: Int
) : ControlParams
方案3:使用靈活的 Map 結構(最簡單通用)
data class ControlParams(val params: Map<String, Any>
)// 使用示例
val controlBody = DeviceControlBody(timestamp = "2023-01-01T00:00:00",deviceId = "light-123",params = ControlParams(mapOf("brightness" to 80,"color" to "red"))
)
方案4:使用 JSON 字符串(與后端交互時常用)
data class ControlParams(val jsonParams: String
)// 使用示例
val paramsJson = """{"brightness": 80, "color": "red"}"""
val controlBody = DeviceControlBody(timestamp = "2023-01-01T00:00:00",deviceId = "light-123",params = ControlParams(paramsJson)
)
推薦方案
根據你的具體需求,我推薦以下方案:
如果參數結構明確且類型安全重要:使用密封類方案(方案1)
如果需要最大靈活性:使用 Map 結構(方案3)
如果需要與 REST API 簡單交互:使用 JSON 字符串(方案4)
完整示例(推薦方案1 + 方案3結合):
// 基礎控制參數接口
interface ControlParams// 特定設備參數
data class LightControlParams(val brightness: Int,val color: String
) : ControlParams// 通用參數實現
data class GenericControlParams(val parameters: Map<String, Any>
) : ControlParams// 設備控制請求體
data class DeviceControlBody(val timestamp: String,val deviceId: String,val params: ControlParams
)// 使用示例
fun main() {// 特定設備控制val lightControl = DeviceControlBody("2023-01-01T00:00:00","light-123",LightControlParams(80, "red"))// 通用設備控制val genericControl = DeviceControlBody("2023-01-01T00:00:00","device-xyz",GenericControlParams(mapOf("speed" to 5, "mode" to "auto")))
}
這種設計既保持了類型安全,又提供了足夠的靈活性來處理不同的設備控制參數。