所以我有下面的代码,用Kotlin写的。
我在最后一条指令行(return params.keys.containsall(MANDATORY_PARAMS)
)上得到一个编译错误,编译器说unsolved reference:MANDATORY_PARAMS
,但我不知道为什么。
我认为同伴对象应该对它们“陪伴”的类的属性具有某种可见性。
(免责声明:此代码正在从Java迁移到Kotlin。在Java版本上,MandatoryParameterShavebeenProvided
以前是同一个类上的静态方法。)
import javax.validation.ConstraintValidator
import javax.validation.ConstraintValidatorContext
class MandatoryParametersValidator : ConstraintValidator<EnforceMandatoryParameters, Map<String, String>> {
val MANDATORY_PARAMS = arrayOf("bookingReference", "lastName")
override fun initialize(constraintAnnotation: EnforceMandatoryParameters?) {
// do nothing
}
override fun isValid(params: Map<String, String>, context: ConstraintValidatorContext?): Boolean {
MANDATORY_PARAMS
.filter { !params.containsKey(it) }
.forEach { parameterName ->
context?.disableDefaultConstraintViolation()
context?.buildConstraintViolationWithTemplate("Mandatory parameter $parameterName is missing.")?.addConstraintViolation()
}
return mandatoryParametersHaveBeenProvided(params)
}
companion object {
fun mandatoryParametersHaveBeenProvided(params: Map<String, String>) : Boolean {
return params.keys.containsAll(MANDATORY_PARAMS)
}
}
}
多谢!
你需要做两件事来让它工作
>
将mandatory_params
移动到同伴对象中。同伴对象类似于Java中类的静态部分。而mandatory_params
在Java中是static final
。
将mandatory_params
的类型从数组
更改为列表
(因为containsall
需要集合
。)
...
companion object {
val MANDATORY_PARAMS = listOf("bookingReference", "lastName")
fun mandatoryParametersHaveBeenProvided(params: Map<String, String>) : Boolean {
return params.keys.containsAll(MANDATORY_PARAMS)
}
}
}
我想知道是否可以在同伴对象中使用类的属性。例如,以贝娄为例: 我不能通过c1或C2调用changeAge()函数。我可以使用changeAge的唯一地方是通过Person1.changeAge(),当Person1还没有用适当的构造函数实例化时。我想知道这些动作是不是有其他的选择,或者是没有,有同伴对象有什么意义呢
我有一个类包含如下所示同伴对象。 我想在运行时修改同伴对象的属性。我将在这个类中添加数百个属性。所以我要做动态。我使用了这个方法,得到如下错误。
我用Kotlin编写了这些方法并分析了字节码: null 上下文。我一直在Kotlin编码,我觉得它很神奇。但有时我需要做一个决定:例如,一个很重的不可变属性,在java中我会将其声明为static final,但在Kotlin中我发现很难“找到一个等价物”。
带有同伴对象的简单示例类 值测试可以通过访问,但如何从MyClass的实例访问?如果我有,那么我如何从sample访问测试?不正确....有没有办法? Java,C++,python等都有很简单的解决方案...(我将为每个有帮助的is提供代码示例),我认为kotlin会有一个比使用Java更好的解决方案。 对于在没有对象实例(如工厂)的情况下访问类属性,kotlin companion objec
在Kotlin的类中,一个对象和一个同伴对象有什么区别? 它的“静态”(我是java方面的)生命周期可能有区别吗?
它在启用R8的版本构建中失败(在build.gradle中的)。它失败,因为返回。 我正在使用“不优化Proguard”配置: 在我自己的proguard-rules.pro中,我几乎添加了我能想象到的所有规则,试图保留这个伴奏对象,并为所有内容添加了注释,但没有任何作用。R8决心将其剥离。 是否有任何其他规则或配置选项可以指示R8保留此伴随对象?