繁体   English   中英

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

[英]Kotlin - attribute visibility to companion object

所以我有下面用Kotlin编写的代码。

我在最后一条指令行上遇到了编译错误( return params.keys.containsAll(MANDATORY_PARAMS) ),编译器说Unsolved reference: MANDATORY_PARAMS ,但我真的不明白为什么。

我认为伴侣对象应该对它们“陪伴”的类的属性具有某种可见性。

我该怎么做才能解决这个问题? 如何使MANDATORY_PARAMSMandatoryParametersValidator及其伴随对象都可见?

(免责声明:此代码已从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. MANDATORY_PARAMS移到伴随对象中。 伴随对象就像Java中类的静态部分。 并且MANDATORY_PARAMS在Java中将是static final

  2. MANDATORY_PARAMS的类型从Array<String>更改为List<String> (因为containsAll需要一个Collection

固定代码如下所示。

    ...

    companion object {
        val MANDATORY_PARAMS = listOf("bookingReference", "lastName")
        fun mandatoryParametersHaveBeenProvided(params: Map<String, String>) : Boolean {
            return params.keys.containsAll(MANDATORY_PARAMS)
        }
    }
}

在这种情况下, MANDATORY_PARAMS是实例属性。 每个MandatoryParametersValidator实例将具有其自己的MANDATORY_PARAMS属性,即使它始终是相同的值。

另一方面,同伴对象是单例object (就像其他所有object ),并且不与MandatoryParametersValidator任何特定实例绑定。 因此,要访问该属性,您需要将类的实例传递给伴随对象内的函数并读取其具有的属性,或者将您的属性放入伴随对象内。

就像您无法从Java中的静态函数访问实例字段和方法的方式一样。 您现在拥有的内容大致等同于以下Java代码:

class MandatoryParametersValidator {

    String[] MANDATORY_PARAMS = ...;

    static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) {
        ...
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM