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

获取和设置依赖于其他字段的方法

  •  0
  • Adisesha  · 技术社区  · 6 年前

    public class Test {
        private String test1;
        private String test2;
    
        public String getTest1() {
            return test1;
        }
    
        public void setTest1(String test1) {
            this.test1 = test1;
        }
    
        public String getTest2() {
            return test2!=null? test2:test1;
        }
    
        public void setTest2(String test2) {
            this.test2 = test2;
        }
    }
    

    Kotlin代码如下,

    class Test(var test1: String? = "") {
        var test2: String?
            get() = if (StringUtils.isNotEmpty(test2)) test2 else test1
            set(test2Val) {
                test2 = test2Val
            }
    }
    

    我错过了什么?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Zoe - Save the data dump 张群峰    6 年前

    test2 最终会成为一名干将。您可以查看生成的Java代码以供参考。

    在自定义getter和setter中,使用 field 相反。所以正确的代码是:

    class Test(var test1: String? = "") {
        var test2: String?
            get() = if (StringUtils.isNotEmpty(field)) field else test1
            set(test2Val) {
                field = test2Val
            }
    }
    

    这会导致第二个问题。您还没有初始化变量,这与vars有关。如果你有 val 以及一个返回其他内容(即。 val x = ... get() = someOtherVar var 不过,这是我的错。但是,在您的情况下,使用 = null (或者 = ""


    此外,Kotlin还有如下方法 isNotEmpty() isNotBlank() 取代了 StringUtils.isNotEmpty() field.isNotEmpty() . 注意这里你要做的 if(field?.isNotEmpty() == true) ... isNotBlank 如果你喜欢的话。

        2
  •  1
  •   lelloman    6 年前
    class Test(var test1: String? = "") {
        var test2: String?
            get() = if (StringUtils.isNotEmpty(test2)) test2 else test1
            set(test2Val) {
                test2 = test2Val // here you are recursively setting the value of test2              
            }
    }
    

    如果要将值赋给 backing field ,应该是

    field = test2Val
    

    但在这种情况下,setter将毫无意义,因为如果不声明它,它将具有相同的行为。 field 是私人财产,以及 get set 你是二传手。您可以选择从getter返回什么,以及如何处理传递给setter的值。

    另一个问题是 test2 需要一个初始值,在Java中,它将默认初始化为 null 但在Kotlin中,必须显式地指定一个初始值。例如,对于空字符串:

    class Test(var test1: String? = "") {
        var test2: String? = ""
            get() = if (StringUtils.isNotEmpty(test2)) test2 else test1
    }