无法打印我的模型实例的值

时间:2018-08-13 12:34:42

标签: class object constructor kotlin

我知道这是一个非常基本的问题,但是对此的回答将解决我的许多疑问。

val new_parent = ParentDetails(intent.extras.getString("name"), 
    intent.extras.getString("email"),
    intent.extras.getString("parent_relation"),
    intent.extras.getString("locationdata"))

println(new_parent.tostring())

上面的代码不会打印出类中存在的各个字段及其值。

ParentDetails是我用初始化的某些字段创建的模型。 ParentDetails模型:

class ParentDetails {
    var parent_id: Int = 0
    var parent_name: String = ""
    var parent_email: String = ""
    var parent_relation: String = ""
    var parent_location: String=""

    constructor(parent_name: String, parent_email: String, parent_relation: String,parent_location:String) {
        this.parent_name = parent_name
        this.parent_email = parent_email
        this.parent_relation = parent_relation
        this.parent_location = parent_location
    }

    public fun getparentId(): Int {
        return parent_id
    }

    fun ParentDetailsprintme() {
        println(parent_name)
        println(parent_email)
        println(parent_relation)
        println(parent_location)
     }
}

实际上,它输出null并访问各个字段,并输出空字符串(初始化方式)。

我们如何解释呢?

3 个答案:

答案 0 :(得分:1)

您是否检查过从intent.extras收到的有效数据?

我还建议您将data class用于模型。 看起来像这样:

data class ParentDetails(
    var parent_id: Int = 0,
    var parent_name: String = "",
    var parent_email: String = "",
    var parent_relation: String = "",
    var parent_location: String = ""
)

您将可以像这样使用它:

val new_parent = ParentDetails(
        parent_name = intent.extras.getString("name"),
        parent_email = intent.extras.getString("email"),
        parent_relation = intent.extras.getString("parent_relation"),
        parent_location = intent.extras.getString("locationdata")
    )
    println(new_parent.tostring())

答案 1 :(得分:1)

据我所知,您的问题是调用println(new_parent.tostring())不会打印出您想在函数ParentDetailsprintme中打印的内容。

首先,您有一个错字,正确的电话应该是new_parent.toString()

请注意,它本可以简化为println(new_parent)

它不会打印您在ParentDetailsprintme方法中定义的内容,因为未调用该方法。

println(new_parent.toString())打印的实际上是对象的哈希码,因为这是每个对象的默认行为。

要使其正常工作,请像println(new_parent.ParentDetailsprintme())那样调用它,或重写toString()方法,例如:

override fun toString() = "$parent_name $parent_email $parent_relation $parent_location"

然后以下

val new_parent = ParentDetails("myName", "myEmail", "myParent_relation", "myLocationdata")
println(new_parent)

应打印

myName myEmail myParent_relation myLocationdata

Kotlin的println函数仅在调用System.out.println(message)的幕后调用String.valueOf()(例如,对象的String.valueOf(Object object)会调用对象的toString()方法传递的对象)。

/** Prints the given message and newline to the standard output stream. */
@kotlin.internal.InlineOnly
public inline fun println(message: CharArray) {
    System.out.println(message)
}

更新(“使用数据类方法也有效” ):

如果您将该类设为数据类:

data class ParentDetails(
        val parent_id: Int = 0,
        val parent_name: String = "",
        val parent_email: String = "",
        val parent_relation: String = "",
        val parent_location: String = ""
)

然后执行

val new_parent = ParentDetails(0, "myName", "myEmail", "myParent_relation", "myLocationdata")
println(new_parent)

您将收到结果

ParentDetails(parent_id=0, parent_name=myName, parent_email=myEmail, parent_relation=myParent_relation, parent_location=myLocationdata)

这是因为data classes覆盖了toString()函数:

  

编译器自动从所有派生以下成员   在主要构造函数中声明的属性:

     
      
  • equals()/ hashCode()对;
  •   
  • toString(),格式为“ User(name = John,age = 42)”;
  •   

答案 2 :(得分:1)

如上所述,您有错字。 toString返回对象的哈希码,除非覆盖该对象的哈希码以返回其他内容。查找原始实现以获取更多详细信息。

通过覆盖toString方法,您可以更改返回的内容,并由此更改print(someClass)时显示的内容。 DVarga在他们的回答中表明了这一点。

Data classes自动生成一个包含类内容的toString方法。因此,创建数据类是获取包含数据的输出的捷径。

您使用的方法不起作用的原因是因为您没有调用它。如果调用它而不是toString,则会得到打印的数据。

此外,在打印类时,将显式调用toString。您无需致电print(someInstance.toString())print(someInstance)就足够了。


在我写答案时,您不需要在Kotlin中使用辅助构造函数。无论是不是数据类,主构造函数都会大大缩短您的代码。另外,您应该研究命名约定。