当前位置: 首页 > 知识库问答 >
问题:

Kotlin-属性对同伴对象的可见性

聂风史
2023-03-14

所以我有下面的代码,用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)
        }
    }
}

多谢!

共有1个答案

蒋胡非
2023-03-14

你需要做两件事来让它工作

>

  • 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保留此伴随对象?