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

Kotlin检查条件并在失败时采取措施的惯用方法

  •  0
  • lannyf  · 技术社区  · 3 年前

    将java转换为kotlin,

    java代码

        private boolean hasEndpoint() {
            if (mSettings == null || mSettings.getEndpoint() == null) {
                if (isDebugMode()) {
                    throw new IllegalArgumentException("endpoint is not set !!!");
                }
                return false;
            }
            return true;
        }
    
       public void doAction_1(...) {
            if (!hasEndpoint()) {
                callback.onError(ENDPOINT_UNINITIALIZED, "ERROR_END_POINT_NOT_SET");
                return;
            }
            //do the action with valid endpoint
            doSomething_1(mSettings.getEndpoint());
        }
    

    科特林:

        private fun hasEndpoint(): Boolean {
            if (mSettings?.endpoint == null) {
                require(!isDebugMode) { "endpoint is not set !!!" }
                return false
            }
            return true
        }
    
        fun doAction_1() {
            if (!hasEndpoint()) {
                callback.onError(ENDPOINT_UNINITIALIZED, "ERROR_END_POINT_NOT_SET")
                return
            }
            //do the action with valid endpoint
            doSomething_1(mSettings!!.getEndpoint());
        }
    

    有多种功能(即。 doAction_1() , doAction_2() …)使用进行相同的检查 hasEndpoint() .

    Kotlin做这种事情的惯用方法是什么?

    1 回复  |  直到 3 年前
        1
  •  3
  •   enzo sblom    3 年前

    您可以使用类似于Python装饰器的概念:

    // Add your check here
    fun withCheck(action: () -> Unit) {
        if (!hasEndpoint()) {
            callback.onError(ENDPOINT_UNINITIALIZED, "ERROR_END_POINT_NOT_SET")
            return
        }
        action()
    }
    
    // Add your actions enclosed with `withCheck`
    fun action1() = withCheck {
        doSomething_1(mSettings!!.getEndpoint());
    }
    
    fun action2() = withCheck {
        doSomething_2(mSettings!!.getEndpoint());
    }
    
        2
  •  2
  •   mightyWOZ    3 年前

    您可以使用 property 而不是 function 对于 hasEndpoint 或者更确切地说 hasNoEndpoint 和使用 when 代替 if else

    private val hasNoEndpoint: Boolean
        get() = when {
            mSettings?.endpoint != null -> false
            isDebugMode -> throw IllegalArgumentException("endpoint is not set !!!")
            else -> true
        }
    
    // use this in withCheck function as in enzo's answer
    fun withEndpoint(action: () -> Unit): Unit = when {
        hasNoEndpoint -> callback.onError(ENDPOINT_UNINITIALIZED, "ERROR_END_POINT_NOT_SET")
        else -> action()
    }