kotlinkotlin

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

2020-02-28  本文已影响0人  门心叼龙

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

数据实体类

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;
    }
class NewsType {
    var id: Int = 0
    var typename: String? = null
    var addtime: String? = null
}    

接口变量

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')))";
    }
}
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
    }
}

懒汉式单例

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);
    }
}

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
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);
    }
}
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
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);
    }
}
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)
上一篇下一篇

猜你喜欢

热点阅读