Kotlin数据类中的参数数量过多

jslywgbw  于 2022-11-30  发布在  Kotlin
关注(0)|答案(4)|浏览(314)

我正在用Kotlin制作一个类似字典的应用程序,其中我有一个数据类,用于每个单词及其含义+变格,所以我有一个包含大约20个参数的数据类:

data class Word(
   val param1: String,
   val param2: String,
   val param3: String,
...
   val param20: String
)

有这么多的参数可以吗?或者有更好的方法吗?它只用于存储和显示数据。

i2loujxw

i2loujxw1#

不确定您的规范,但您是否考虑过重新设计您的方法,其中您有一个data class,并有一个list属性,如下所示?

data class Word(
    var name: String,
    var meaning: List<String>,
    var declensions: List<String>
)

虽然在一个类或任何结构中有这么多参数并不坏,但您只限于N参数(在您的情况下为20个)。
你可以考虑为每一个可能有多于或少于20个含义/变格的单词指定这样一个data class,如果含义或变格少于20,你也不必指定一个空参数,但我再次不确定你的用例。

yqyhoc1h

yqyhoc1h2#

z. y的答案是适合您案例的正确解决方案。
考虑到您正在开发字典应用程序,可能会出现需要快速访问精确单词数据的情况。您可以将单词存储在Map中,其中键将是单词本身,值将是含义和变化。在这种情况下,建议的数据类将过多。
您可以将其简化为

data class WordData(
    val meanings: List<String>,
    val declensions: List<String>
)

然后像这样将其存储在Map中

val dictionary: HashMap<String, WordData>

然后你就可以访问,例如,所需单词的含义,就像这样

val word = "dog"
dictionary[word]?.meanings.forEach {
    println(it)
} ?: println("There is no word $word in the dictionary")
7y4bm7vi

7y4bm7vi3#

您可以比其他示例更进一步,构建一个完整的数据结构,如果它适合您正在处理的数据的话!
含义在列表中可能没问题,对吧?但是对于变格,你可能想把它们放在一些有意义的结构中,而不是仅仅把它们放在列表中。你可以使用 * 另一个 * 数据类来实现这一点:

data class Declensions(
    val nominativeSingular: String? = null,
    val nominativePlural: String? = null,
    val genitiveSingular: String? = null,
    ...
)

通过这种方式,您可以为存储的每个字符串赋予含义,并且可以在向用户显示内容、执行查找、制作测试问题等时使用该含义!
您可以在WordData类中使用该对象:

data class WordData(
    val name: String,
    val meanings: List<String>,
    val declensions: Declensions
)

另一种选择是,您可以将每个变格定义为一段数据,而不是定义包含所有可能性的大Declensions对象(如果未使用,则将它们保留为 * null *):

// an enum like this can let you define a fixed set of possible values
enum class Case { NOMINATIVE, GENITIVE, DATIVE... }

data class Declension(val case: Case, val singular: String, val plural: String)

然后添加您需要的内容:

data class WordData(
    val name: String,
    val meanings: List<String>,
    val declensions: List<Declension>
)

val word = WordData(
    name = "wordo",
    meanings = listOf("A made-up word"),
    declensions = listOf(
        Declension(NOMINATIVE, singular = "wordo", plural = "wordoo"),
        ...
    )
)

您也可以使用 * map * 代替 * list *,并将Case类型Map到数据对象,这样每个case就有一个对象(该对象保存该case表单的所有信息)。
实际上,这是一个有组织的事情,思考什么代表你想要表示的特定数据,以及如何将其组织成更大的数据对象,作为一个有用的容器和组织者。我只是举了一些模糊的例子--这真的取决于你需要表示的语言和数据。以及你想用它做什么。也许简单的列表也很好!但是你肯定有选择,有时更多的结构确实很有帮助

oyxsuwqo

oyxsuwqo4#

1.有这么多参数可以吗?

  • 当然不会 *

1.有没有更好的办法?

  • 是的,有几个 *

一种方法是将相关参数组合到单个对象中
Person数据类上的firstName、middleName和surName示例

data class Name(val firstName: String, val middleName: String, val surName: String)

然后用“Name”类封装原始的“Person”类。

data class Person(val name: Name, .....)

你必须在你的“Word”类中识别这样的关系。
另一种方法是构建器模式,这在构建复杂对象时很流行。不确定在你的环境中是否可行。

相关问题