Kotlin类设计疑问:是否需用自定义get/set及暴露基础参数?
关于Kotlin德语动词变位类的两个设计疑问解答
1. 是否应将内部属性的条件定义封装到显式get()和set()方法中?
完全没必要模仿Java的显式get/set方法——Kotlin的属性系统本身就内置了getter和setter逻辑,直接利用它才是符合Kotlin风格的做法:
- 如果某个属性是基于原形/三单推导的计算属性(比如第一人称变位),直接用
val配合自定义getter:val firstSingular: String get() = infinitive.removeSuffix("en") + "e" // 示例推导逻辑 - 如果是需要校验的可变属性(不过动词变位场景下一般用不可变属性,此处仅作示例),直接自定义setter:
var someMutableProperty: String = "" set(value) { if (value.isNotEmpty()) field = value // 条件校验逻辑 }
这种方式既保持了封装性,又符合Kotlin的语法习惯,外部访问时直接用.firstSingular,和访问普通属性一样简洁,背后自动执行你的自定义逻辑。
2. 是否应将原形和第三人称单数这两个基础参数作为类属性暴露?
这取决于你的业务场景和设计意图:
- 如果外部代码需要获取这些核心数据(比如展示动词原形、做其他语法分析),那就用
val暴露——Kotlin的val是只读属性,外部只能读取不能修改,完美兼顾封装性和可用性:class GermanVerb(val infinitive: String, val thirdSingular: String) { // ... 其他推导逻辑 } - 如果这两个参数只是内部推导的依据,外部完全不需要接触,那就封装成
private val,只在类内部使用:class GermanVerb(infinitive: String, thirdSingular: String) { private val _infinitive = infinitive private val _thirdSingular = thirdSingular // ... 内部用_infinitive/_thirdSingular推导其他变位 }
另外,如果你有派生类(比如你的GermanVerbModalIrregular)需要访问这些基础参数,可以把它们设为protected val,让派生类能读取但外部不能访问,平衡封装和继承需求。
总结下来,核心原则是:用Kotlin的属性系统替代Java式的显式get/set方法,根据业务需求决定核心参数的可见性,优先用不可变属性(val)保证数据安全。
内容的提问来源于stack exchange,提问作者swrutra
相关产品推荐
相关产品推荐

