标签: data-class

处理多个对象实例的最佳方式

部分原因是我无法在 Kotlin 中创建没有参数的数据类,因此我object在这些情况下使用 s,例如

sealed class Node {
  object Leaf : Node()
  data class Branch(val left:Node, val right:Node) : Node()
}
Run Code Online (Sandbox Code Playgroud)

问题是,有时,我最终会得到该类的多个实例Leaf。显然,这种情况通常不会发生,但在使用某些框架和某些测试用例进行序列化和反序列化时会发生。

现在,您可能会说我应该修复这些情况,但很难知道它们可能在哪里,并且并不总是可能或不需要修改框架的反序列化语义。

因此,我希望s的所有object实例都充当相同的值,就像无参数data class(或 Scala 中的无参数case class)一样。

到目前为止,我最好的解决方案如下,包含在object我创建的每个可能遇到此问题的解决方案中:

object SaneLeaf {
    override fun hashCode() = javaClass.hashCode()
    override fun equals(other: Any?) = other?.javaClass == javaClass
}
Run Code Online (Sandbox Code Playgroud)

显然,这是冗长且容易出错的,因为似乎不可能将这些实现抽象到接口中。在对象不需要扩展另一个类的情况下,超类可以工作,但情况通常并非如此。

或者,我可以创建一个带有Nothing参数的数据类。但这似乎更像是一种黑客行为。

其他人如何处理这个问题?是否计划添加hashCodeequals实现遵循这些类的假定语义的对象(所有实例应该相等/相同的 hashCode)?

kotlin data-class

4
推荐指数
1
解决办法
1355
查看次数

具有不同支持字段类型的 Kotlin 数据类

我有一个用于 JSON 序列化的简单类。为此,外部接口使用Strings,但内部表示不同。

public class TheClass {

    private final ComplexInfo info;

    public TheClass(String info) {
        this.info = new ComplexInfo(info);
    }

    public String getInfo() {
        return this.info.getAsString();
    }

    // ...more stuff which uses the ComplexInfo...
}
Run Code Online (Sandbox Code Playgroud)

我在 Kotlin 中工作(不确定是否有更好的方法)。但非 val/var 构造函数阻止我使用data.

/*data*/ class TheClass(info: String) {

    private val _info = ComplexInfo(info)

    val info: String
        get() = _info.getAsString()


    // ...more stuff which uses the ComplexInfo...
}
Run Code Online (Sandbox Code Playgroud)

我如何让它作为一个工作data class

kotlin data-class

4
推荐指数
1
解决办法
2199
查看次数

如何在 Kotlin 中使用扩展属性作为常量?

我有数据类

data class User(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        val userId: Long = 0,

        @Column(nullable = false, unique = true)
        val email: String = "",

        @Column(nullable = false)
        val firstName: String = "",
)
Run Code Online (Sandbox Code Playgroud)

我讨厌使用 "" 进行初始化。我想使用类似的东西

 @Column(nullable = false)
 val firstName: String = String.EMPTY
Run Code Online (Sandbox Code Playgroud)

我知道扩展属性或函数,但它们看起来也不太好

val firstName: String = "".empty()
val firstName: String = "".EMPTY
Run Code Online (Sandbox Code Playgroud)

你如何编写实体类?有没有更优雅的方式?

nhibernate spring kotlin data-class

4
推荐指数
1
解决办法
1251
查看次数

Kotlin 数据类与公开类?

当我将我的 java 项目转换为 kotlin 项目时,我开始了解 kotlin 中的数据类(Java 模型类的替换)。

现在我需要我kotlin data class的支持,RealmObject但根据RealmObject 的 Kotlin 数据类链接 ,它说 Realm 显然不支持数据类,所以我需要将我的data classas open class.

所以基本上,我想知道这两个术语之间的区别。

java model realm kotlin data-class

4
推荐指数
1
解决办法
2952
查看次数

即使我实现了所有的hashCode(),equals()和toString(),我还应该使用数据类吗?

我有一个类,它是字符串的解析结果,因此我必须强制执行toString()以返回该源字符串而不是那些已解析的值.它还具有自定义equals()/ hashCode()机制.将其标记为数据类还有什么好处?

kotlin data-class

3
推荐指数
1
解决办法
321
查看次数

Kotlin:如何在数据类中继承属性

我有像这样声明的抽象令牌类:

abstract class Token(var index: Int = 0) {
open fun merge(toMerge: Token): Token? {
    return null
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在数据类中继承index属性,如下所示:

data class CloseLoop(index: Int, var openLoopIndex: Int = 0) : Token(index)
Run Code Online (Sandbox Code Playgroud)

但它给了我错误 Data class primary constructor must have only property (val / var) parameters

我需要做些什么来解决这个问题?

inheritance kotlin data-class

3
推荐指数
1
解决办法
2928
查看次数

数据类Kotlin到Java类

我有一个kotlin数据类,正在尝试从Java方法调用它。

data class Item  (
                @PrimaryKey(autoGenerate = true) var var1: Long? ,
                @ColumnInfo(name ="var1") var var2: Long){}
Run Code Online (Sandbox Code Playgroud)

从Java,我试图保存Item的列表,所以我需要实例化Data类。我不知道该怎么做。

java android kotlin data-class

3
推荐指数
1
解决办法
3015
查看次数

Python中定义一个数据类的正确方法是什么,该数据类同时具有自动生成的 __init__ 和来自值字典的附加 init2

在 Python 中,我有一个包含十多个成员的数据类。我用它创建一个字典并将其发布到 ElasticSearch 中

现在我想从 ElasticSearch获取一个字典并用它来初始化数据类。

自从:

  1. Python 不允许创建具有不同签名的第二个 __ init __ 。
  2. 我不想手动编写自动生成的 __ init __ 只是为了添加可选参数
  3. 我不想添加可选参数来接受字典,只是为了让 __ init __ 保持自动生成。

我想添加第二个方法init2,它将返回数据类的实例,并将传递的 dict 参数解析到自动生成的 __ init __ 方法中。


我会感谢您的意见来决定我下面建议的解决方案是否是正确的实施。

另外,这种实现可以被视为一种工厂吗?

谢谢。


跟进:由于我从 ES 请求中获取的 JSON\dictionary 是:

  1. 与数据类具有完全相同的关键字

  2. 是扁平的,id,没有嵌套对象。

我可以简单地将这些值作为 **dict 传递到自动生成的 __ init __ 方法中。

对于这个具体案例,请参阅下面我的回答:


from dataclasses import dataclass

@dataclass
class MyData:
    name: str
    age: int = 17

    @classmethod
    def init_from_dict(cls, values_in_dict: dict):
        # Original line using MyData was fixed …
Run Code Online (Sandbox Code Playgroud)

python data-class python-dataclasses

3
推荐指数
1
解决办法
4889
查看次数

Kotlin 中的深度合并数据类

如何在 Kotlin 中对两个数据类进行递归/深度合并?像这样的东西:

import kotlin.reflect.*
import kotlin.reflect.full.*

data class Address(
  val street: String? = null,
  val zip: String? = null
)

data class User(
  val name: String? = null,
  val age: Int? = null,
  val address: Address? = null
)

inline fun <reified T : Any> T.merge(other: T): T {
  val nameToProperty = T::class.declaredMemberProperties.associateBy { it.name }
  val primaryConstructor = T::class.primaryConstructor!!
  val args = primaryConstructor.parameters.associate { parameter ->
    val property = nameToProperty[parameter.name]!!
    val type = property.returnType.classifier as KClass<*>
    if (type.isData) …
Run Code Online (Sandbox Code Playgroud)

reflection kotlin data-class

3
推荐指数
1
解决办法
934
查看次数

将数据类传递到其他可组合屏幕

我有一个数据类

data class Holder(uri: String, title: String, desc: String, source: String, color: String?)我从屏幕 a 获得的信息,我想将其传递到屏幕 b。我的代码设置如下:

@Composable
fun A(navigateToScreenB: (holder: Holder) -> Unit) {...}

@Composable
fun B(holder: Holder) {...}

in my nav file:
composable(
           route = Screen.b.route
          ) {
             B(how to get `Holder` to pass here)

          }

 composable(
            route = Screen.A.route
        ) {
            A(
                navigateToScreenB = { it ->
                    // `it` is my data class `Holder`, but how to pass it to screen b?
                    navController.navigate(Screen.B.route)
                }
            )
        }
Run Code Online (Sandbox Code Playgroud)

对此有何见解?

android kotlin data-class android-jetpack android-jetpack-compose

3
推荐指数
1
解决办法
1844
查看次数