部分原因是我无法在 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参数的数据类。但这似乎更像是一种黑客行为。
其他人如何处理这个问题?是否计划添加hashCode和equals实现遵循这些类的假定语义的对象(所有实例应该相等/相同的 hashCode)?
我有一个用于 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?
我有数据类
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)
你如何编写实体类?有没有更优雅的方式?
当我将我的 java 项目转换为 kotlin 项目时,我开始了解 kotlin 中的数据类(Java 模型类的替换)。
现在我需要我kotlin data class的支持,RealmObject但根据RealmObject 的 Kotlin 数据类链接
,它说 Realm 显然不支持数据类,所以我需要将我的data classas open class.
所以基本上,我想知道这两个术语之间的区别。
我有一个类,它是字符串的解析结果,因此我必须强制执行toString()以返回该源字符串而不是那些已解析的值.它还具有自定义equals()/ hashCode()机制.将其标记为数据类还有什么好处?
我有像这样声明的抽象令牌类:
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
我需要做些什么来解决这个问题?
我有一个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类。我不知道该怎么做。
在 Python 中,我有一个包含十多个成员的数据类。我用它创建一个字典并将其发布到 ElasticSearch 中。
现在我想从 ElasticSearch获取一个字典并用它来初始化数据类。
自从:
我想添加第二个方法init2,它将返回数据类的实例,并将传递的 dict 参数解析到自动生成的 __ init __ 方法中。
我会感谢您的意见来决定我下面建议的解决方案是否是正确的实施。
另外,这种实现可以被视为一种工厂吗?
谢谢。
跟进:由于我从 ES 请求中获取的 JSON\dictionary 是:
与数据类具有完全相同的关键字
是扁平的,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) 如何在 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) 我有一个数据类
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
data-class ×10
kotlin ×9
android ×2
java ×2
inheritance ×1
model ×1
nhibernate ×1
python ×1
realm ×1
reflection ×1
spring ×1