基于UML设计,Kotlin是否需显式实现getName等访问器方法?
问题
我已经依据UML设计实现了一个Kotlin Student类,现在纠结要不要显式实现UML中标注的getName()、getAddress()和setAddress()方法。我知道Kotlin会为类属性隐式生成getter和setter,而且这些方法也不需要额外逻辑,本来打算用隐式实现,但因为UML明确标出了这些方法,所以拿不准该选隐式生成还是显式实现。
以下是我用隐式访问器实现的Kotlin类代码:
class Student(val name: String, var address: String) { private var numCourses: Int = 0 private val courses: Array<String> = Array(MAX_COURSES) { "" } private val grades: IntArray = IntArray(MAX_COURSES) companion object { const val MAX_COURSES = 30 } fun printGrades() { print(name) for (i in 0 until numCourses) { print(" ${courses[i]}:${grades[i]}, ") } println() } fun calculateAverageGrade() = grades.sum().toDouble() / grades.size fun addCourseGrade(course: String, grade: Int) { require(numCourses < MAX_COURSES) { "A student cannot take more than $MAX_COURSES courses" } require(grade in 0..100) { "Grade must be between 0 and 100" } courses[numCourses] = course grades[numCourses] = grade numCourses++ } override fun toString() = "name($address)" }
回答
- 优先用Kotlin隐式访问器:Kotlin的属性机制完全适配UML要求——
val name会自动生成符合JavaBean规范的getName()方法,var address会自动生成getAddress()和setAddress(String)方法,这些隐式生成的方法签名和UML标注的完全一致,不管是Kotlin内部调用还是和Java代码交互都能正常工作。这种写法符合Kotlin惯用风格,减少冗余代码,避免手动实现的失误。 - 仅在需要额外逻辑时显式实现:如果
getName()、getAddress()或setAddress()需要添加额外逻辑(比如参数校验、日志输出、数据转换等),才需要显式写出这些方法;如果只是简单的属性读写,完全没必要显式实现。 - 补充代码小问题:注意到
toString()方法里写的是"name($address)",这里应该改为"$name($address)",否则会固定输出字符串"name"而不是学生的实际名字。
内容的提问来源于stack exchange,提问作者Ali Dehkhodaei
相关产品推荐
相关产品推荐

