You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:52:47