1. var/val/lateinit
这三个关键字是在宣告参数时最常用到的几个,常看到的写法如下
val mValue1 = "value1"lateinit var mValue2: Stringvar mValue3 = "value2"
说明一下大概用法以及跟Java Code是如何对应
基本上如果使用val定义参数,就一定要给予一个数值,并且在宣告之后不能再修改,类似Java final(mValue1)
使用var则可以选择是否要立即给予与数值,如果不马上给值就要加上lateinit告知编译器(mValue2)。或者先设定预设值后续再修改写法如(mValue3)
2. 冒号 :
目前我自己开发时很常碰到的几个地方,没写到的不表示没有喔,后续有碰到会再新增上来
继承(extends)class MainActivity : AppCompatActivity() { // 这边的继承是有括号的AppCompatActivity() // 因为在Java中没有 所以需要特别注意 // 如果是要继承有建构子的class还需要带入参数 后续补充}
实作(implements)class MainActivity : AppCompatActivity(), View.OnClickListener { // 同时有继承、实作的写法 // 实作Interface就没有括号了 // 如果要实作多个Interface就继续往后加上 , XXXXXX(Interface name)}
回传值(return)// 定义回传值为Intoverride fun getItemCount(): Int { return mData.size}
参数型态// 定义mValue为Stringlateinit var mValue: String
3. 问号?/双惊叹号!!
有加上问号才能将数值指派为null
var mValue : String? = null
加上双惊叹号表示,我确定在这个时机,textView绝对不为null
var textView : TextView = findViewById(R.id.textView)textView!!.text = "123"
常见组合起来的用法就是类似这样,其实你自己有做好判断,确定在这个时机下绝对不会为null,才会使用!!
fun setValue(textView: TextView?) { if(textView != null){ textView!!.text = "123" } else{ println("textView is null") }}
4. switch case
比较一下Java/Kotlin写法
// Javapublic void onClick(View view) { switch (view.getId()){ case R.id.button: onBackPressed(); break; }}
比较大的差异是Kotlin字眼是用when并且不需要break
// Kotlinfun onClick(view: View) { when (view.id) { R.id.button -> { onBackPressed() } }}
5. 建构子constructor
这边我们综合继承使用
BaseViewModel需要宣告为open才能被继承使用
可以注意到Repository没有指派数值,也没有宣告为lateinit但却不会报错,主要是因为这个值在建构子时已经指派了
open class BaseViewModel : ViewModel { private var mRepository: Repository constructor(repo : Repository) { mRepository = repo }}// 继承传递建构子参数// 在2.1 AppCompatActivity()有提到括号的部分,其实并不是括号,而是需要传递参数class MainViewModel(repo : Repository) : BaseViewModel(repo) {}
6. object/Singleton
object有几个用法,首先是object class,宣告及呼叫方法如下
object class其实就是Kotlin中Singleton的用法,不清楚Singleton可以到先前这篇文章稍微了解一下
object ApiService { fun request() { ... }}ApiService.request()
接下来是companion object
Kotlin用来定义成static参数或function方式
这边可以看到还有一个叫做const的宣告,const必须放在object中
class Const { companion object { const val END_POINT = "https://www.google.com/" fun getEndPoint() : String{ return END_POINT } }}// 呼叫Const.END_POINTConst.getEndPoint()
object介绍完要来讨论一下Singleton,不是说Kotlin Singleton用object class就搞定了吗
基本款是这样没错,但是object class没有办法带参数,这有点遗憾
所以我爬了一些文后有找到一些写法不是用object class完成Kotlin Singleton
大概像这样,这边是比较基础的写法,我看到的还有用到also,后续再做一篇来解释
class Repository { // 我需要用到的参数 => Context // 我想在实体化Singleton时带入 private lateinit var mContext : Context companion object { @Volatile private var sInstance: Repository? = null fun getInstance(context: Context): Repository { if(sInstance == null) { synchronized(this) { sInstance = Repository() sInstance!!.mContext = context } } return sInstance!! } }}// 呼叫Repository.getInstance(context)