2017-06-30 21 views
1

私は以下のコードをKotlinで書いています。Kotlin - コンパニオンオブジェクトへの属性の可視性

最後の命令行(return params.keys.containsAll(MANDATORY_PARAMS))でコンパイルエラーが発生しましたが、コンパイラにはUnsolved reference: MANDATORY_PARAMSと表示されますが、なぜそれほど大きな理由はありません。

私は、コンパニオンオブジェクトは、「会社を守る」クラスの属性にある種の可視性があると考えられました。

これを解決するにはどうすればよいですか? MandatoryParametersValidatorとそれに付随するオブジェクトの両方にMANDATORY_PARAMSを表示させるにはどうすればよいですか?

(免責事項:このコードはKotlinへのJavaから移行されている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) 
     } 
    } 
} 

どうもありがとう!

答えて

3

あなたはコンパニオンオブジェクトにこの作業

  1. 移動MANDATORY_PARAMSを取得するには2つのことを行う必要があります。コンパニオンオブジェクトは、Javaのクラスの静的な部分と似ています。そして、MANDATORY_PARAMSは、Javaではstatic finalになります。

  2. 変更List<String>からArray<String>からMANDATORY_PARAMSの種類(containsAll以降はCollection必要とする。)

固定のコードは次のようになります。

... 

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

MANDATORY_PARAMSは、この場合のインスタンスプロパティです。 MandatoryParametersValidatorのすべてのインスタンスは、常に同じ値になりますが、独自のMANDATORY_PARAMSプロパティを持ちます。

コンパニオンオブジェクトはシングルトンであり(他のすべてのobjectと同じように)、MandatoryParametersValidatorという特定のインスタンスには関連付けられていません。したがって、そのプロパティにアクセスするには、クラスのインスタンスをコンパニオンオブジェクト内の関数に渡し、それが持つプロパティを読み込むか、またはプロパティをコンパニオンオブジェクト内に配置する必要があります。

これは、Javaの静的関数からインスタンスフィールドとメソッドにアクセスできない方法と同じです。あなたが現在持っているのは、このJavaコードとほぼ同じです。

class MandatoryParametersValidator { 

    String[] MANDATORY_PARAMS = ...; 

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

}