我在Kotlin中使用数据类来显着减少我不得不写的Java代码量.
但是,在我的一个Java类中,我不知道如何在Kotlin中实现相同的结果.
我的Java类看起来有点像这样:
public class DataObject {
private int mId;
private String mName;
public DataObject(int id, String name) {
mId = id;
mName = name;
}
public DataObject(Context context, int id) {
mId = id;
Cursor cursor = ...
cursor.moveToFirst();
mName = cursor.getString(...);
cursor.close();
}
public int getId() {
return mId;
}
public String getName() {
return mName;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在Kotlin中重写它,到目前为止我有这个:
data class DataObject(val id: Int, val name: String) {
constructor(context: Context, id: Int) : this(id, fetchName(context))
private fun fetchName(context: …Run Code Online (Sandbox Code Playgroud) 我想要一个接受只读列表的数据类:
data class Notebook(val notes: List<String>) {
}
Run Code Online (Sandbox Code Playgroud)
但它也可以接受MutableList,因为它是一个子类型List.
例如,以下代码修改传入的列表:
fun main(args: Array<String>) {
val notes = arrayListOf("One", "Two")
val notebook = Notebook(notes)
notes.add("Three")
println(notebook) // prints: Notebook(notes=[One, Two, Three])
}
Run Code Online (Sandbox Code Playgroud)
有没有办法如何在数据类中执行传入列表的防御副本?
class Animal {
val name: String
constructor(name: String){
this.name = name // initialized via constructor
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的类,Kotlin我能够通过辅助构造函数初始化val属性,但Data类不允许这样做
data class User(val name: String, val postalCode: Int) {
val email: String
constructor( email: String): this("", 1){
this.email = email // error: value can not be reassigned
}
}
Run Code Online (Sandbox Code Playgroud)
我无法理解的是,电子邮件属性已经初始化,因为我还没有声明任何初始化?
Boolean literal argument without parameter name
当参数名称显示在值的左侧时,为什么会出现此警告Boolean?我知道如何解决这个问题,但是警告是否必须修复,或者我可以保持原样吗?该Boolean值将来会定期更改,因此我更喜欢易于调整的代码。
项目的数据类
data class Food (val foodName: String,
val hasDairy: Boolean,
val hasGluten: Boolean,
val hasSoya: Boolean,
val hasWheat: Boolean)
Run Code Online (Sandbox Code Playgroud)
片段类
...
myList.add(Food(getString(R.string.name_of_food),
true,
false,
true,
false))
...
Run Code Online (Sandbox Code Playgroud) 有没有办法从 Kotlin 类/数据类自动生成 JSON 模式或 Protobuf 模式?我有一个 android 项目,我希望能够在 TypeScript 和 Swift 中使用我的数据模型类,而无需再次编写它们。由于存在从 JSON 模式到几乎所有编程语言的转换器,我想将 Kotlin 类转换为 JSON 模式就可以了。
在 Jetpack Compose 中,我们看到所有内置可组合项都具有扁平化输入,这是有意的吗?或者用数据类包装太多的输入(这是良好且干净的做法)具有相同的性能?
考虑这个样本
data class SettingsItemEntity(
val title: String,
val description: String? = null,
@DrawableRes val imageResId: Int? = null,
val isChecked: Boolean? = null,
val showDivider: Boolean = true,
val onItemClicked: () -> Unit = {},
val onCheckedChange: (isChecked: Boolean) -> Unit = {},
val buttonLabel: String? = null,
val onButtonClicked: () -> Unit = {},
)
@Composable
fun SettingsItem(
entity: SettingsItemEntity,
modifier: Modifier = Modifier
) {
...
}
Run Code Online (Sandbox Code Playgroud)
在性能(重组)中将输入作为数据类或扁平输入发送会更好吗?或者有相同的结果?
换句话说,当我们将一个数据类发送给可组合函数时,我们只更改其中的一个成员,是否会导致整个函数重新组合?或者重组方面,它与使用扁平输入时具有相同的性能吗?
预先感谢您的帮助。
我正在尝试使用 Kotlin Multiplatform 创建一个小型应用程序,在其中我可以保存书名及其作者,但我正在努力解决数据类以及如何将它们映射在一起,以便我获得作者及其所有书籍和发布日期。
CREATE TABLE book(
id INTEGER NOT NULL,
name TEXT NOT NULL,
publishDate INTEGER NOT NULL,
authorId INTEGER NOT NULL
)
CREATE TABLE author(
id INTEGER NOT NULL,
name TEXT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这是我的数据类:
@Serializable
data class bookEntity(
id: Int,
name: String,
authorId: Int
)
@Serializable
data class authorEntity(
id: Int,
authorName: String
books: List<bookEntity>
)
Run Code Online (Sandbox Code Playgroud)
和我的查询:
selectAuthors:
SELECT * FROM author
JOIN book ON book.authorId = author.id
WHERE book.authorId = author.id
Run Code Online (Sandbox Code Playgroud)
我尝试了以下映射,但它不起作用:
private fun mapAuthor(
id: …Run Code Online (Sandbox Code Playgroud) 关于data类,禁止在主构造函数中不使用var或val关键字,即每个参数都隐式转换为类属性。但是,有时我不希望每个参数都变成类属性。
因此,据我所知,没有机会在主构造函数中传递只能在构造函数中访问并且在实例构造完成后被遗忘的参数。这有充分的理由吗?
我认为解决这个问题的唯一方法是不使用data类或使用允许非 var/val 前缀变量的辅助构造函数。然而,有很多需要传递的参数,二级构造函数会极大地膨胀类。当然,我可以将所有参数包装到另一个对象中,但这只会将问题转移到另一个地方。
是否有推荐的方法或模式来应对?
我正在使用 Kotlin 制作一个类似字典的应用程序,其中每个单词及其含义 + 词尾变化都有一个数据类,因此我有一个包含大约 20 个参数的数据类:
data class Word(
val param1: String,
val param2: String,
val param3: String,
...
val param20: String
)
Run Code Online (Sandbox Code Playgroud)
有这么多参数可以吗还是有更好的方法吗?它仅用于存储然后显示数据。
我认为我在这里缺少 Jetpack Compose 的核心概念。non-constructor data class property当我尝试更改可组合项的内部且此可组合项是观察列表的一部分时,我遇到了问题。
不起作用:(sadProperty未在构造函数中声明)
data class IntWrapper(val actualInt: Int = 0) {
var sadProperty: Int = 0
}
@Preview
@Composable
fun test() {
var state by remember { mutableStateOf(listOf(IntWrapper(1), IntWrapper(2), IntWrapper(3),IntWrapper(4)))}
fun onClick(item: IntWrapper) {
val indexOf = state.indexOf(item)
val newState = state.minus(item).toMutableList()
val copy = item.copy()
copy.sadProperty = Random.nextInt()
newState.add(indexOf, copy)
state = newState
}
Column() {
for (item in state) {
Text("ac: ${item.actualInt} sad: ${item.sadProperty}", modifier = Modifier.clickable { onClick(item)}) …Run Code Online (Sandbox Code Playgroud) android kotlin data-class android-jetpack-compose compose-recomposition
data-class ×10
kotlin ×10
android ×4
constructor ×1
java ×1
json ×1
kmm ×1
model ×1
recompose ×1
schema ×1
sqldelight ×1