java、kotlin的单例与构造方法对比

单例模式:静态内部类

object Test51 {
    val instance: Test51
        get() = SingletonInstance.INSTANCE

    private object SingletonInstance {
        internal val INSTANCE: Test51 = Test51
    }
}

//测试
fun main() {
    var instance = Test51.instance
}
public class Test52 {

    private Test52() {
    }

    private static class SingletonInstance {
        private static final Test52 INSTANCE = new Test52();
    }

    public static Test52 getInstance() {
        return SingletonInstance.INSTANCE;
    }

    //测试
    public static void main(String[] args) {
        Test52 instance = Test52.getInstance();
    }
}

单例模式:双重检测

public class Test42 {

    private static volatile Test42 singleton;

    private Test42() {
    }

    public static Test42 getInstance() {
        if (singleton == null) {
            synchronized (Test42.class) {
                if (singleton == null) {
                    singleton = new Test42();
                }
            }
        }
        return singleton;
    }

    public static void main(String[] args) {
        Test42 instance = Test42.getInstance();
    }
}
object Test41 {
    @Volatile
    private var singleton: Test41? = null

    val instance: Test41?
        get() {
            if (singleton == null) {
                synchronized(Test41::class.java) {
                    if (singleton == null) {
                        singleton = Test41
                    }
                }
            }
            return singleton
        }
}

fun main() {
    val instance = Test41.instance
}

自定义view的构造方法对比:

public class MyJavaView extends View {
    public MyJavaView(Context context) {
        this(context, null);
    }

    public MyJavaView(Context context, AttributeSet attrs) {
        this(context, attrs, -1);
    }

    public MyJavaView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MyJavaView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public static void main(String[] args) {
        MyJavaView myJavaView1 = new MyJavaView(null);
        MyJavaView myJavaView2 = new MyJavaView(null, null);
        MyJavaView myJavaView3 = new MyJavaView(null, null, -1);
        MyJavaView myJavaView4 = new MyJavaView(null, null, -1, -1);
    }
}

class MyKotlinView1 : View {
    constructor(ctx: Context?) :
            this(ctx,null)

    constructor(ctx: Context?, attrs: AttributeSet?) :
            this(ctx,null,-1)

    constructor(ctx: Context?, attrs: AttributeSet?, defStyleAttr: Int = -1) :
            super(ctx, attrs, defStyleAttr)
}

class MyKotlinView2 @JvmOverloads constructor(
    context: Context?,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = -1
) : View(context, attrs, defStyleAttr) {
    
    constructor(
        context: Context?,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = -1,
        defStyleRes: Int = -1
    ) : this(context, attrs, defStyleAttr)

}

fun main() {
    var myKotlinView11 = MyKotlinView1(null)
    var myKotlinView12 = MyKotlinView1(null, null)
    var myKotlinView13 = MyKotlinView1(null, null, -1)

    var myKotlinView21 = MyKotlinView2(null)
    var myKotlinView22 = MyKotlinView2(null, null)
    var myKotlinView23 = MyKotlinView2(null, null, 1)
    var myKotlinView24 = MyKotlinView2(null, null, 1, 2)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值