在Kotlin中创建表示嵌套xml的类的最佳方法是什么

在Kotlin中创建表示嵌套xml的类的最佳方法是什么,kotlin,inner-classes,Kotlin,Inner Classes,考虑以下xml文件 <Dataset> <Table1> <colA>AAA</colA> <colB>BBB</colB> </Table1> <Table1> <colA>aa</colA> <colB>bb</colB> </Table1>

考虑以下xml文件

<Dataset>
    <Table1>
        <colA>AAA</colA>
        <colB>BBB</colB>
    </Table1>
    <Table1>
        <colA>aa</colA>
        <colB>bb</colB>
    </Table1>
    <Table2>
        <colX>xxx</colX>
    </Table1>
</Dataset>
问题是-当我创建Dataset类的实例时,我无法设置其中内部类的属性,即使我可以读取它们,是不是因为它们没有实例化? 换句话说,下面代码的输出是xx而不是xOK

val dataset = Dataset()
print("${dataset.Table2().colX}")    //returns x as in the class declaration
dataset.Table2().colX = "OK"
print("${dataset.Table2().colX}")    //returns x, but I want it to return OK
我可以在外部类中实例化内部类时设置属性:

class Dataset {
    val table1 = Table1()
    val table2 = Table2()
    inner class Table1 {
...
但正如我前面提到的,我使用ArrayList

这意味着,如果我理解正确,当我为Table1条目创建一个数据集,然后将其附加到ArrayList中时,我仍然在该数据集中实例化了dataset.table2,即使它没有被使用

我也可以像这样实例化内部类:

class Dataset {
    inner class Table1 {
        var colA:String = ""
        var colB:String = ""
    }
    inner class Table2 {
        var colX:String = "x"
    }
}
table1 = Dataset().Table1()
data class Table1 (var colA: String = "", 
                   var colB: String = "")

data class Table2 (var colX: String = "")

data class DataSet (var table1: Table1? = null,
                    var table2: Table2? = null)
只要我可以将它们添加到现有的Dataset实例中

val dataset = Dataset()
dataset.Table1() = table1    //this bit doesn't work for me :(
因此,总结一下:

1关于如何更好地构造Dataset类,您有什么想法吗


2如果没有,如何在外部类的实例中设置内部类的属性?

您对表1和表2的定义只不过是类定义,所以是的,您需要参数来表示它们的实例。问题不仅在于它们没有被实例化,而且根本没有它们的属性

当需要其他类时,实例化外部类的副本的想法没有意义。编译器要求您这样做的唯一原因是在这些类定义中使用了关键字inner。因为它们没有与Dataset共享的引用,所以它们不需要是内部的

“内部”的含义是,类只能存在于外部类的上下文中。内部类的好处是它可以直接引用外部类的属性,并且您总是知道内部类的任何实例都与外部类的特定实例有内在的链接。对于这样一个简单的层次结构,您不需要任何这些内部类特性

你需要这样的东西:

class Dataset {
    inner class Table1 {
        var colA:String = ""
        var colB:String = ""
    }
    inner class Table2 {
        var colX:String = "x"
    }
}
table1 = Dataset().Table1()
data class Table1 (var colA: String = "", 
                   var colB: String = "")

data class Table2 (var colX: String = "")

data class DataSet (var table1: Table1? = null,
                    var table2: Table2? = null)
因为您的表是可选的,所以它们必须可以为null,null值表示它为空

在类定义中使用数据使Kotlin为您生成toString、hashcode和equals

示例XML显示了数据集中的多个表1,因此您可能需要将数据集的参数更改为集合,以便能够容纳每种类型的多个表:

data class DataSet (val table1s: MutableList<Table1> = mutableListOf(),
                    val table2s: MutableList<Table2> = mutableListOf())

感谢您的及时回复,这非常有帮助,您总是知道,内部类的任何实例都与外部类的特定实例有内在联系,这就是想法,我没有包含特定于数据集的属性,因为我认为它们会模糊我希望在Android中使用数据集实例来拥有特定于数据集的ContentProvider的视图,而不是多个特定于表的ContentProviders,所以假设我保留了内部类,我需要在Dataset中添加表示内部类的可空属性,对吗?然后让它们成为数据类查看编辑以了解有关内部类问题的信息。dataset.table1=dataset.table1-这正是我所缺少的,非常感谢