首页 > 解决方案 > 为什么使用 println 不打印字段值?

问题描述

我有以下类定义、实例创建和打印实例的字段:

class Rental (location: String, monthlyRent: Float) {
    var location: String = ""
        get () = field
        set (value) { field = value }
}


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        println("Hello World")
        var myRental = Rental("12341.132,34314", 234.4f)
        println("""My rental is! ${myRental.location}""")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(setOf(
            R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications))
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }
}

打印语句仅打印“我的租金是!” 在 Logcat 而不是其余的。如何解决这个问题?

标签: kotlin

解决方案


您没有location对构造函数的参数做任何事情。该location属性正在使用 初始化""。如果要使用构造函数参数来初始化属性,则需要显式这样做:

class Rental (location: String, monthlyRent: Float) {
    var location: String = location // see here
        get () = field
        set (value) { field = value }
}

旁注:您的自定义get()set()属性的默认行为完全多余,因此可以消除它们。

此外,您可以将构造函数参数也定义为属性,方法是在其前面放置varval,这更简单:

class Rental (var location: String, var monthlyRent: Float) {
}

像这样的简单数据保存类应该被定义为data类,这样它们会自动toString()为您方便地生成,以及copy()如果您需要它。

data class Rental (val location: String, val monthlyRent: Float)

推荐阅读