代码之家  ›  专栏  ›  技术社区  ›  felipecao

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

  •  1
  • felipecao  · 技术社区  · 7 年前

    最后一条指令行出现编译错误( 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 回复  |  直到 7 年前
        1
  •  3
  •   Michael Anderson    7 年前

    你需要做两件事才能让它工作

    1. MANDATORY_PARAMS 强制参数 static final

    2. 更改类型 强制参数 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)
            }
        }
    }
    
        2
  •  1
  •   zsmb13    7 年前

    MANDATORY_PARAMS MandatoryParametersValidator 会有自己的 强制参数 属性,即使其值始终相同。

    另一方面,伴生物体是单态的(就像其他物体一样 object 强制参数验证器 。因此,要访问该属性,您需要将类的实例传递给伴随对象内的函数并读取其具有的属性,或者将您的属性放入伴随对象内。

    这就像Java中不能从静态函数访问实例字段和方法一样。您现在拥有的大致相当于以下Java代码:

    class MandatoryParametersValidator {
    
        String[] MANDATORY_PARAMS = ...;
    
        static bool mandatoryParametersHaveBeenProvided(Map<String, String> params) {
            ...
        }
    
    }