kotlin属性定义和声明是要求必须做好初始化
基本数据类型
开始初始化的时候给属性赋值个默认值
private var currentPage = 0
private var isCanFished = false
或者通过使用 Delegates.notNull()
private var currentPage by Delegates.notNull<Int>()
private var isCanFished by Delegates.notNull<Int>()
引用类型
var修饰 可以使用lateinit
private lateinit var name: String
或者使用Delegates.notNull()
private var name by Delegates.notNull<String>()
val 修饰的 使用Delegates.notNull()
private val name by Delegates.notNull<String>()
或者使用lazy
lazy()
lazy()是接受一个 lambda 并返回一个 Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用 get() 只是返回记录的结果
常见场景是,只获取,不赋值,并且多次使用的对象
private val homeArticleAdapter by lazy { HomeArticleAdapter() }
自定义属性代理实现属性委托 支持基本类型和引用类型
class Preference<T>(private val context: Context,private val name: String, private val default: T): ReadWriteProperty<Any?, T>{
companion object{
const val IS_LOGIN = "is_login"
}
private val prefs: SharedPreferences by lazy{
PreferenceManager.getDefaultSharedPreferences(context)
}
override fun getValue(thisRef: Any?, property: KProperty<*>): T{
return getValue(name, default)
}
override fun setValue(thisRef: Any?,property: KProperty<*>,value: T){
putValue(name,value)
}
private fun<T> putValue(name: String, value: T) = with(prefers.edit()) {
when(value){
is Long -> putLong(name,value)
is String -> putString(name,value)
is Boolean -> putBoolean(name,value)
is Int -> putInt(name,value)
is Float -> putFloat(name,value)
else ->putString(name, serialize(value))
}
}
private fun<T> getValue(name: String, default: T): T = with(prefers){
val res: Any = when(default){
is Long -> getLong(name,default)
is String -> getString(name,default)
is Boolean -> getBoolean(name, default)
is Int -> getInt(name,default)
is Float -> getFloat(name,default)
else -> deSerialization(getString(name,serialize(defalut)))
}
return res as T
}
@Throws(IOException::class)
private fun <A> serialize(obj: A): String {
val byteArrayOutputStream = ByteArrayOutputStream()
val objectOutputStream = ObjectOutputStream(
byteArrayOutputStream)
objectOutputStream.writeObject(obj)
var serStr = byteArrayOutputStream.toString("ISO-8859-1")
serStr = java.net.URLEncoder.encode(serStr, "UTF-8")
objectOutputStream.close()
byteArrayOutputStream.close()
return serStr
}
@Suppress("UNCHECKED_CAST")
@Throws(IOException::class, ClassNotFoundException::class)
private fun <A> deSerialization(str: String): A {
val redStr = java.net.URLDecoder.decode(str, "UTF-8")
val byteArrayInputStream = ByteArrayInputStream(
redStr.toByteArray(charset("ISO-8859-1")))
val objectInputStream = ObjectInputStream(
byteArrayInputStream)
val obj = objectInputStream.readObject() as A
objectInputStream.close()
byteArrayInputStream.close()
return obj
}
}