kotlin語法使用筆記

kotlin中文文檔:http://www.kotlindoc.cn/ClassesAndObjects/Classes-and-Inheritance.htmlhtml

1. 聲明類的構造方法

例如繼承FragmentPagerAdapter時聲明一個構造方法——java

class ViewPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
     init {
        //初始化
     }
}

 

當聲明多個構造方法時,如ide

public class LoadMoreRecyclerView extends RecyclerView {
        public LoadMoreRecyclerView(Context context) {
            super(context);
        }

        public LoadMoreRecyclerView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public LoadMoreRecyclerView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
}

 

寫做kotlin時,將主構造函數寫在類名後(函數類不使用初始化時可將大括號去掉):函數

class LoadMoreRecyclerView(context: Context?) : RecyclerView(context) {

        constructor(context: Context, attrs: AttributeSet):this(context){

        }

        constructor(context: Context, attrs: AttributeSet, defStyle: Int):this(context, attrs)

}

 

若是是一個實體類,須要實現自定義的構造方法:this

constructor(id: Long, price: Double, url: String): this() {
        this.id = id
        this.price = price
        this.url = url
}


2. 靜態方法

定義靜態方法時用companion object{}包裹在方法外層url


3. 定義一個常量不爲空時,使用!!和?.的區別:

①!!spa

a!!.foo()debug

//至關於java: code

if(a!=null){
        a.foo();
    }else{
        throw new KotlinNullPointException();
}

 

②?.orm

a?.foo()

//至關於java:

if(a!=null){
   a.foo();
}

 

4. 繼承(extend)和實現(implements)

1.繼承:

   java——

public class MainActivity extends BaseActivity{}

   kotlin——

class MainActivity : BaseActivity(){}

 

2.實現:

   java——

public class HomeBase implements Parcelable { }

   kotlin——

class HomeBase() : Parcelable{}


注意:HomeBase後面跟的小括號即表示一個無參數的構造函數,參見上面說的的《聲明構造方法》

 

3.同時繼承且實現,逗號隔開就好了:

   java——

public class MainActivity extends BaseActivity implements MainContract.View {}

   kotlin——

class MainActivity : BaseActivity(), MainContract.View {}

 

5. 靜態內部類

kotlin默認的內部類是靜態內部類,不能持有外部類的狀態(屬性、方法等)
給內部類加上inner關鍵詞以後,就會變成非靜態內部類

class HomeAdapter{
        private inner class SpanSizeLookup : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int): Int {
                return list[position].spanCount
            }
        }
}

 在非靜態的方法中調用時,須要加上open,即

open inner class SpanSizeLookup : GridLayoutManager.SpanSizeLookup() {
}

6. return的使用

當直接返回到方法外時

fun method{
   if (isInEditMode) lit@{
      return@lit
   }
}

7. 特殊語法

url == null ? "" : url 可寫做 url ?: "" holder instanceof HeadHolder 可寫做 holder is HeadHolder

在new一個變量並調用其實現方法時(相似註冊監聽)

MarqueeLayoutAdapter<HomeBase> topAdapter = new MarqueeLayoutAdapter<HomeBase>(headlineList) {
        @Override
        protected void initView(View view, int position, HomeBase item) {
            ((TextView) view).setText(item.getName());
        }

};

可寫做

val topAdapter = object : MarqueeLayoutAdapter<HomeBase>(headlineList) {
        override fun initView(view: View, position: Int, item: HomeBase) {
            (view as TextView).text = item.name
        }

}

 8. 修飾符(public,private,protected,internal )

kotlin中一樣有修飾符,與java一樣的public,private,protected,kotlin中默認爲public,因此能夠省略不寫,還有一個java中沒有的interval修飾符

internal 修飾類的方法,表示這個類方法只適合當前module使用,若是其餘module使用的話,會找不到這個internal方法或者報錯

好比在moduleA中建立方法methodA B:

class Activity_A() {

      fun methodA(){
            Log.i("debug=","methodA")
        }

       internal fun methodB(){
            Log.i("debug=","methodB")
        }

}

而後在moduleB中調用:

void callMethod(){
    new Activity_A().methodA(); //正常。 

  new Activity_A().methodB();//報錯,usage of kotlin internal declaration from different module
}

9. BaseFragment<T>的使用 

通常都會有一個fragment的基類,如:

abstract class BaseFragment<T : BasePresenter> : Fragment(){
      ...
}

當在java中的使用以下時:

private ArrayList<BaseFragment> fragments;

在kotlin中的用法照理(對,照個人理)來講是這樣:

val tabs = ArrayList<BaseFragment>()

可是會報錯

One type argument expected for class BaseFragment<T : BasePresenter> : Fragment

提示須要匹配基類的參數類型,即val tabs = ArrayList<BaseFragment<SomePresenterType>>()

val tabs = ArrayList<BaseFragment<BasePresenter>>()

而BasePresenter若是還有繼承,如

interface BasePresenter<T : BaseView> {}

那麼就得再加上basePresenter的參數類型:

val tabs = ArrayList<BaseFragment<BasePresenter<BaseView>>>()

 

10. 取消findViewById

在kotlin中已經再也不使用findViewById了,而是直接使用控件的id名:

java中:

mTextView = view.findViewById(R.id.textl_view);
mTextView.setText("Shirley");

kotlin:

textl_view.text = "Shirley"

 

11. switch & when

這裏就直接上代碼吧

java:

       switch (currentState) {
            case NORMAL_STATE:
                if (mNormalView == null) {
                    return;
                }
                mNormalView.setVisibility(View.INVISIBLE);
                break;

       case ERROR_STATE: mErrorView.setVisibility(View.GONE); default: break; }

kotlin:

     when (currentState) {
            NORMAL_STATE -> {
                if (mNormalView == null) {
                    return
                }
                mNormalView.visibility = View.INVISIBLE
            }
            ERROR_STATE -> mErrorView.visibility = View.GONE
            else -> {
            }
      }

 

12. xx.class的表達

java:

Intent intent = new Intent(this, AboutActivity.class);
startActivity(intent);

kotlin:

val intent = Intent(this, AboutActivity::class.java)
startActivity(intent)
相關文章
相關標籤/搜索