Kotlin - 对协同对象

时间:2017-06-30 05:46:44

标签: java kotlin kotlin-interop

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

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

我认为伴侣对象应该对他们“保持联系”的类的属性有某种可见性。

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

(免责声明:此代码正在从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)
        }
    }
}

非常感谢!

2 个答案:

答案 0 :(得分:3)

你需要做两件事来实现这个目标

  1. MANDATORY_PARAMS移动到随播广告对象中。伴随对象就像Java中类的静态部分。 Java中MANDATORY_PARAMSstatic final

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

  3. 固定代码如下所示。

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

答案 1 :(得分:1)

在这种情况下,

MANDATORY_PARAMS是一个实例属性。 MandatoryParametersValidator的每个实例都有自己的MANDATORY_PARAMS属性,即使它始终是相同的值。

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

这就像您无法从Java中的静态函数访问实例字段和方法的方式。你现在拥有的大致相当于这个Java代码:

class MandatoryParametersValidator {

    String[] MANDATORY_PARAMS = ...;

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

}