안드로이드 코 틀린 다른 전화 조건부 생성자를 사용 중지

Wirling :

나는 클래스와 코 틀린로 작성된 안드로이드 응용 프로그램이 BaseKeyListener확장 DigitsKeyListener. 내 최소 SDK 버전입니다 21. 이 클래스는 현재 사용되지 않는 생성자를 호출한다. 그러나 새로운 생성자는 API 레벨 26 위쪽에서만 사용할 수 있습니다. 어떻게 조건부 API 수준에 따라 생성자를 호출 것?

나는 기본적으로 배치 같은 문제의 안드로이드 동안 전을하지만,이 솔루션은 코 틀린에 작동하지 않습니다.

코 틀린에 내 수업은 이제 다음과 같습니다 :

// primary constructor 'DigitsKeyListener' shows lint warning about deprecation.
abstract class BaseKeyListener() : DigitsKeyListener() {

}

나는 안드로이드 질문에 대한 솔루션을 적용하면이 코드를 얻을 :

abstract class BaseKeyListener : DigitsKeyListener {

    // still results in deprecation warning
    constructor() : super()
}

또한 제공된 대안 솔루션은 내가 생성자는 비공개로하고, newInstance와 패턴을 구현했다이었다. BaseKeyListener과 BaseKeyListener에서 상속은 추상 것을 다른 클래스가 있기 때문에 그러나 나는 그 솔루션을 사용할 수 없습니다.

내가 생각할 수있는 유일한 방법은 이것이다 :

abstract class BaseKeyListener : DigitsKeyListener {

   constructor()

    @RequiresApi(Build.VERSION_CODES.O)
   constructor(locale: Locale) : super(locale)
}

그러나 그 결과로 나는 각각의 서브 클래스에 대한 두 개의 생성자를 정의해야합니다. 그리고 내가 조건을 우리가 동일한 사용하는 로케일 동안 모든 시간을 추가해야 클래스를 사용했다.

불행한 결과 :

open class AmountKeyListener : BaseKeyListener {

    constructor() : super()

    @RequiresApi(Build.VERSION_CODES.O)
    constructor(locale: Locale) : super(locale)
}

// usage of the keyListener
editText.keyListener = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) KeyListenerUtil.AmountKeyListener(
        MY_LOCALE) else KeyListenerUtil.AmountKeyListener()

이상적인 솔루션은 한 줄에 AmountKeyListener을 할당해야하며, 우리의 사용자 정의 로케일 MY_LOCALE '를 사용하는 경우 BaseKeyListener는 알아야한다

editText.keyListener = KeyListenerUtil.AmountKeyListener()

어떻게이 문제를 해결하기 위해?

Tenfour04 :

당신은 기본적으로 링크 된 자바 솔루션은 바로 중단을 무시하고 독점적으로 사용되지 않는 생성자를 사용하고 있습니다. 나는 마지막 솔루션이 최선의 하나라고 생각합니다. 그것의 사용은 직접 DigitsKeyListener를 사용하는 경우보다 더 나쁜 없다 -는 SDK 버전을 확인해야 여전히 you'd.

나는 위 참조 하나의 작은 문제가 첫 번째 생성자는 암시 적으로 빈 슈퍼 생성자를 호출하여 본질적으로 언어 해킹 무엇을 통해 중단 경고를 피할 수 있다는 것입니다. 정말,이 코 틀린의 코드 관리자에서 버그가 수 있도록 나에게 보인다. 나는 명시 적으로 슈퍼 생성자를 호출하고 또한 자신의 클래스에서이 생성자를 더 이상 사용하는 것이 더 적절할 것 같아요. 내가 만들 것 그래서는 다음과 같다 :

abstract class BaseKeyListener : DigitsKeyListener {

    @Suppress("DEPRECATION")
    @Deprecated("Use the constructor with a locale if on SDK 26+.")
    constructor(): super()

    @RequiresApi(Build.VERSION_CODES.O)
    constructor(locale: Locale) : super(locale)
}

이 기능 작동 방법을 변경하지 않지만, 당신의 벌거 벗은 생성자를 비하하지 않고,이 사고로 모든 곳에서 DigitsKeyListener의 사용되지 않는 버전을 사용하는 것은 매우 쉽게된다.

위를 가지고있는 것처럼 당신은 또한 둘 것 제외하고는 사용 부위에 통증이 있지만, 그것은 보일 것 @Suppress("DEPRECATION")사용 중단 경고를 인정하는 그 라인 직전.

추천

출처http://43.154.161.224:23101/article/api/json?id=339688&siteId=1