Kotlin 使用class 主构造和成员属性传参问题

//枚举上声明的属性 如果不加 var/val 就不是 成员 属性!!!,不能用this.xxx ,所有内部传入这些参数时候要特别注意
//没有val/var 就是一次性的参数,并不是成员属性!!!
enum class MyFont(
    val fontname: String,
    val encoding: String = BaseFont.IDENTITY_H,
    val embedded: Boolean = BaseFont.EMBEDDED,
    val size: Float = 16F,
    val style: Int = Font.BOLD,
    val color: Color = Color.RED
) {

    F_STD_EN("lhandw"),
    F_STD_CN("stxingka"),
    F_STXINGKA("stxingka"),
    F_LHANDW("lhandw"),
    F_NOTO_SANS("notosans-vf"),
    F_SCRIPT_BL("scriptbl"),
    F_SEGOEPR("segoepr"),
    F_SEGOEPR_B("segoeprb"),
    F_SOURCE_HAN_SANS_CN("sourcehansanscn-vf"),
    F_SOURCE_HAN_SANS_SC("sourcehansanssc-vf"),


    ;

//    init {
//        p("initiatie MyFont")
//    }


    companion object {
        //这个里面无法debug!!!
        init {

            p("instantiate MyFont constants")

            val fontFiles = arrayOf(
                "LHANDW.TTF",
                "NirmalaB.ttf",
                "NotoSans-VF.ttf",
                "SCRIPTBL.TTF",
                "segoepr.ttf",
                "segoeprb.ttf",
                "SourceHanSansCN-VF.ttf",
                "SourceHanSansSC-VF.ttf",
                "STXINGKA.TTF"

            )
            for (i in fontFiles) {
                register(fontPath(i), alias(i))
            }
        }
    }

    //secondary ,default private
//    constructor( fontname: String,
//                encoding: String = BaseFont.IDENTITY_H,
//                embedded: Boolean = BaseFont.EMBEDDED,
//                size: Float = 16F,
//                style: Int = Font.BOLD,
//                color: Color = Color.BLUE)  {
//        this.font = newFont(fontname, encoding, embedded, size, style, color)
//    }

    //默认先使用的主构造上没有 val的变量是不能使用  this.xxx!!!相当于一次性使用的函数参数!!!
    //主构造 无论是 加不加 var/val ,都不行!!!
    //无论主构造还是第二构造都不行 !!!
    //font 成员 不对 是null
    //估计与companion object 的初始化 顺序有关系吧, 外部类 和内部内 static/init 初始化的先后顺序是不确定的!!!
//    val font: Font // = newFont(this.fontname, this.encoding, this.embedded, this.size, this.style, this.color)
    //不行没用的
//    val font: Font // = newFont(fontname, encoding, embedded, size, style, color)
    var font: Font? = null
        get() {
            //不能只用font属性,会产生循环调用,不知道内部是怎么翻译java代码的
            if(Objects.isNull(field)){
                p("fontname:",fontname,)
                field = newFont(fontname, encoding, embedded, size, style, color)
            }
            return field
        }


}

1.主构造上没有 val/var 就不是成员变量了,就是临时的像函数参数一样的变量!!!
即使是 类 也有 函数参数 和 成员属性 的区别

2.成员属性 val/var 变量 = initialzer,如果这个initializer的初始化参数是 主构造
或者是第二构造 传过来的参数 或者 成员属性 ,都是没用的,极有可能隐藏错误,感觉这里有 java 的 
init 初始化 和 构造函数初始化 先后顺序的问题?

3.companion object 的初始化 和 外部类 的初始化 感觉先后顺序不确定,调用的时候,一定要注意。

4.在1.5.31中 kotlin companion object的init <=> java 外部类 static {} ? 不知道以后会不会变。

5.属性值 用get 和 set 时候 不能用 属性变量,否则就 递归 了(这时候的属性就是getXXX),最好用 field 来表示 其值。




上一篇:Android中的基类—抽取出来公共的方法


下一篇:C#中App目录