美文网首页kotlinkotlin
Kotlin-简约之美-进阶篇(十八):与Java的较量

Kotlin-简约之美-进阶篇(十八):与Java的较量

作者: 门心叼龙 | 来源:发表于2020-02-28 09:38 被阅读0次

    @[toc]
    在Java当中一些常量通常情况下都是定义在接口当中,默认情况下所有的成员变量都是public static final类型的,所有的方法都是public abstract类型的,而在Kotlin中的接口是不允许定义常量的,但是我们可以通过伴生对象companion object来解决这个问题。

    数据实体类

    • Java中的实现
    public class NewsType {
        public int id;
        public String typename;
          public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getTypename() {
            return typename;
        }
        public void setTypename(String typename) {
            this.typename = typename;
        }
    
    • Kotlin中的实现
    class NewsType {
        var id: Int = 0
        var typename: String? = null
        var addtime: String? = null
    }    
    

    接口变量

    • Java中的定义:
    public interface NewsDBConfig {
        String DB_NAME = "fly_news.db";
        int VERSION_CODE = 1;
    
        interface NewsType {
            String TABLE_NAME = "news_type";
            String CLUMN_ID = "id";
            String CLUMN_TYPE_NAME = "typename";
            String CLUMN_ADD_TIME = "addtime";
            String CREATE_TABLE = "create table " + TABLE_NAME + " ("+CLUMN_ID+" integer PRIMARY KEY autoincrement," + CLUMN_TYPE_NAME + " varchar(64),"+CLUMN_ADD_TIME+" datetime default (datetime('now','localtime')))";
        }
    }
    
    • Kotlin中的定义
    interface NewsDBConfig {
    
        interface NewsType {
            companion object {
                val TABLE_NAME = "news_type"
                val CLUMN_ID = "id"
                val CLUMN_TYPE_NAME = "typename"
                val CLUMN_ADD_TIME = "addtime"
                val CREATE_TABLE = "create table $TABLE_NAME ($CLUMN_ID integer PRIMARY KEY autoincrement,$CLUMN_TYPE_NAME varchar(64),$CLUMN_ADD_TIME datetime default (datetime('now','localtime')))"
            }
        }
        companion object {
            val DB_NAME = "fly_news.db"
            val VERSION_CODE = 1
        }
    }
    

    懒汉式单例

    • Java中的实现
    public class NewsDBHelper extends SQLiteOpenHelper {
        private static NewsDBHelper mNewsDBHelper;
        public static NewsDBHelper getInstance(Context context) {
            if (mNewsDBHelper == null) {
                synchronized (NewsDBHelper.class) {
                    mNewsDBHelper = new NewsDBHelper(context);
                }
            }
            return mNewsDBHelper;
        }
    
        private NewsDBHelper(Context context) {
            super(context, NewsDBConfig.DB_NAME, null, NewsDBConfig.VERSION_CODE);
        }
    }
    
    
    • Kotlin中的实现
    class NewsDBHelper private constructor(context: Context) :
        SQLiteOpenHelper(context, NewsDBConfig.DB_NAME, null, NewsDBConfig.VERSION_CODE) {
    
        companion object {
            private var mNewsDBHelper: NewsDBHelper? = null
            fun getInstance(context: Context): NewsDBHelper? {
                if (mNewsDBHelper == null) {
                    synchronized(NewsDBHelper::class.java) {
                        if (mNewsDBHelper == null) {
                            mNewsDBHelper = NewsDBHelper(context)
                        }
                    }
                }
                return mNewsDBHelper
            }
        }
    }
    

    构造方法

    情况1
    • Java中的实现
    public class MyView extends View {
        public MyView(Context context) {
            super(context);
        }
    
        public MyView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }
    
    • Kotlin中的实现
    class MyView : View {
        constructor(context: Context) : super(context) {}
    
        constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
    
        constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr) {}
    }
    
    情况2
    • java中的实现
    public class MyView1 extends View {
        public MyView1(Context context) {
            this(context,null);
        }
    
        public MyView1(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public MyView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }
    
    • Kotlin中的实现
    class MyView1 @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : View(context, attrs, defStyleAttr)
    

    或者

    class MyView2 : View {
        @JvmOverloads
        constructor(
            context: Context,
            attrs: AttributeSet? = null,
            defStyleAttr: Int = 0
        ) : super(context, attrs, defStyleAttr) {  }
    
    

    lambda的应用

    无参数
    1. 常规写法
    fun print() { 
        println("HelloWorld")
    }
    
    1. lambda标准写法
    var print1: () -> Unit = {println("HelloWorld1")}
    
    1. lambda简写
    var print2 = {println("HelloWorld2")}
    
    有参数加法
    1. 常规写法
    fun add(x: Int, y: Int): Int {
        return x + y
    }
    
    1. lambda标准写法
    var add1: (Int, Int) -> Int = { x, y -> x + y }
    
    1. lambda简写
    var add2 = { x: Int, y: Int -> x + y }
    
    作为函数参数
    1. 一般写法
    fun add3(x: Int, y: Int): Int {return x * y}
    fun add4(a: Int, b: Int): Int {return a + b}
    //调用
    var result = add4(1, add3(2, 3))
    
    1. lambda写法
    fun add5(x:Int,add6:(Int,Int)->Int):Int{
        return x + add6.invoke(2,3)
    }
    //调用
    var result5 = add5(1,{x:Int,y:Int -> x*y})
    
    1. lambda写法
    fun add7(x:Int,add8:(Int)->Boolean):Int{
        if(add8(x)){
            return x
        }else{
            return 0
        }
    }
    //调用1
    var add81 = add7(10,{x:Int -> x > 0})
    //调用2
    var add82 = add7(10,{it > 0})
    

    匿名函数

    1. 标准写法
    fun add(x: Int, y: Int): Int {
        return x + y
    }
    

    或者

    fun add1(x: Int, y: Int): Int = x + y
    
    1. 匿名写法
    var add2 = fun(x: Int, y: Int): Int {
        return x + y
    }
    
    1. 匿名写法
    var add3 = fun(x: Int, y: Int): Int = x + y
    

    闭包

    1.函数嵌套

    fun test1() {
        println("test1")
        fun test2() {
            println("test2")
        }
    }
    

    2.函数作为返回值

    fun test2(x: Int): () -> Int {
        var a = 0
        return fun(): Int {
            a++
            return a + x
        }
    }
    //调用
    var test = test2(10)
    println(test())
    println(test())
    println(test())
    

    3.函数作为返回值

    fun test3(v: Int): (Int, Int) -> Int {
        var a = 1
        var b = 2
        return { x, y -> x + y + a + b + v}
    }
    //调用
    var test2 =test3(10)
    var result = test2(12,1)
    println(result)
    

    相关文章

      网友评论

        本文标题:Kotlin-简约之美-进阶篇(十八):与Java的较量

        本文链接:https://www.haomeiwen.com/subject/nwwxhhtx.html