当前位置:网站首页>Delay initialization and sealing classes
Delay initialization and sealing classes
2022-07-06 08:35:00 【So, dream】
Delay initialization
background
Kotlin The variable non nullability feature is provided to suppress the null pointer problem .
This feature ensures program security while , It also brings us some coding problems .
Case study : Just imagine , There is a global variable in your program a , Variable a It was not initialized at the beginning of creation , So you make it equal to null.
hypothesis a The type of String, Because to guarantee a Non empty , So its type is declared as String?
private var a: String? = null
Next , Every time you need to call a The method in , All of them should be judged as empty ( Even if it has already been initialized ), Otherwise, you cannot compile !
When there are more and more instances of global variables in the code , This problem will become more obvious .
Delay initialization
To solve this problem ,Kotlin Use lateinit Keyword initializes variables .
private lateinit var a: String
lateinit Keyword telling Kotlin compiler , I will be in Then initialize the variable , So you don't have to assign a variable to null.
such , When calling global variables a Method in , There is no need to judge the empty space .
When using this object , It needs to be initialized , Otherwise, there will be a runtime error !
Avoid repeated initialization
To avoid repeated initialization of variables , You can use the following code
if (!::a.isInitialized) {
// Judge a Whether to initialize , If the execution code block is not initialized
a = "ming ming" // Yes a Perform initialization operation
}
::object.isInitialized It is a fixed writing method for judging initialization .
Sealing class
background
Create a new one Result.kt file , Write the following code in the file :
interface Result
class Success(val message:String):Result
class Failure(val error: Exception):Result
A is defined in the code Result Interface , Used to represent the execution result of an operation .
Define two classes to implement Result Interface ,Success Class is used to represent the result of success ,Failture Class is used to represent the result of failure .
Let me define one more getResultMessage(), Information used to execute the final execution result , The code is as follows
fun getResultMessage(result: Result) = when(result){
is Success -> result.message
is Failure -> result.error.message
else -> throw IllegalArgumentException()
}
getResultMessage() Method to receive a Result Parameters .
We use it when Sentence to judge Result The type of , If Success, Print success message , If Failture Return error message .
Be reasonable , This should end the code . Because the execution result of the code is either successful , Or failure , There is nothing else .
But for Satisfy Kotlin The grammar check of , At the end, I wrote a else To throw an exception ( Actually this else Can never reach ).
Besides , If we add another class inheritance Result Interface , And forgot to getResultMessage() Add the corresponding execution code ,
When the code is executed, it will be thrown directly else The abnormal .
Sealing class
Sealed classes can easily solve the above problems , To declare a sealed class, you only need to add keywords in front of the class sealed.
take Result The interface is transformed into a sealed class
sealed class Result
class Success(val message:String):Result()
class Failure(val error: Exception):Result()
The next in when Pass in the sealed class as a condition ,Kotlin It will check the subclasses of the seal class , And force you to deal with the conditions corresponding to each subclass , This ensures that even if you don't write else Conditions , There will be no missing branches .
fun getResultMessage(result: Result) = when(result){
is Success -> result.message
is Failure -> result.error.message
}
When we build a new one Others Class inheritance Result Sealing class ,getResultMessage() Will report a mistake .
We can go through Add remaining branches To add the processing of the corresponding conditions of all subclasses .
边栏推荐
- 优秀的软件测试人员,都具备这些能力
- 被破解毁掉的国产游戏之光
- [2022 Guangdong saim] Lagrange interpolation (multivariate function extreme value divide and conquer NTT)
- swagger设置字段required必填
- 查看局域网中电脑设备
- visdom可视化实现与检查介绍
- Char to leading 0
- China vanadium battery Market Research and future prospects report (2022 Edition)
- logback1.3. X configuration details and Practice
- 深度剖析C语言指针
猜你喜欢
CISP-PTE实操练习讲解
堆排序详解
vulnhub hackme: 1
Restful API design specification
JVM performance tuning and practical basic theory - Part 1
sublime text的编写程序时的Tab和空格缩进问题
egg. JS getting started navigation: installation, use and learning
Trying to use is on a network resource that is unavailable
[MySQL] lock
JS inheritance method
随机推荐
Online yaml to CSV tool
sys.argv
synchronized 解决共享带来的问题
如何进行接口测试测?有哪些注意事项?保姆级解读
从表中名称映射关系修改视频名称
查看局域网中电脑设备
logback1.3. X configuration details and Practice
Light of domestic games destroyed by cracking
IoT -- 解读物联网四层架构
Mobile phones and computers on the same LAN access each other, IIS settings
On the inverse order problem of 01 knapsack problem in one-dimensional state
PC easy to use essential software (used)
swagger设置字段required必填
【MySQL】日志
Bottom up - physical layer
Char to leading 0
Cisp-pte practice explanation
What is CSRF (Cross Site Request Forgery)?
Summary of MySQL index failure scenarios
MySQL learning record 07 index (simple understanding)