假设我想A
通过从类B
中复制值来实例化类的对象,这是常见的做法,例如在映射DTO时。为了在Java或Groovy中完成此操作,我将在适当的DTO上创建带有签名的静态方法fromB(A a)
,然后a.val = b.val...
在Java中或a.with { val = b.val... }
在Groovy中使用复制值。
在Kotlin中,我注意到它instance.apply{}
与Groovy的相似之处with
在于,它允许我直接访问对象变量,而无需不断引用对象本身,因为该引用似乎隐含在闭包中。
但是,在伴侣对象中使用Apply时遇到了一个奇怪的意外错误。如果我A().apply {}
在A的伴随对象的函数中使用,Expression is inaccessible from a nested class 'Companion', use 'inner' keyword to make the class inner
则会收到一个奇怪的错误,因为我直接在对象的实例上调用apply,因此希望我始终可以访问它的公共属性。更不用说似乎不能将伴侣对象设置为inner
错误对象,因此错误消息中的建议并不是很有帮助。
这是完整的示例代码:
fun main(args: Array<String>) {
val b = B("Hello", "World")
val a = A.fromB(b)
print("$a.value1 $a.value2")
}
class A() {
var value1: String? = null
var value2: String? = null
companion object {
//This fails with "Expression is inaccessible from a nested class 'Companion', use 'inner' keyword to make the class inner"
fun fromB(b: B): A {
return A().apply {
value1 = b.value3
value2 = b.value4
}
}
}
}
class B(val value3: String, val value4: String) {}
//This works
fun bToA(b: B): A {
return A().apply {
value1 = b.value3
value2 = b.value4
}
}
这里发生了什么?我究竟做错了什么?
在我看来,这似乎是个虫子。可能与内联函数(例如apply
)和伴随对象有关。我建议搜索JetBrains Bug&Issue Tracker,如果找不到与此类似的东西,请创建一个新的Issue。
同时,我看到了一些替代方法:
使用this
(不理想):
fun fromB(b: B): A {
return A().apply {
this.value1 = b.value3
this.value2 = b.value4
}
}
将value1
和value2
移至A
的主要构造函数,然后更改fromB(B)
为使用命名参数(仍然可以让您定义默认值,在复制时跳过属性,等等):
class A(var value1: String? = null, var value2: String? = null) {
companion object {
fun fromB(b: B): A {
return A(
value1 = b.value3,
value2 = b.value4
)
}
}
}
更新:除了上面你可以用b
用with
:
fun fromB(b: B) = with(b) {
A(
value1 = value3,
value2 = value4
)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句