Kotlin如何安全访问lateinit变量

Kotlin设计之初就是不允许非null变量在声明期间不进行初始化的,为了解决这个问题,Kotlin lateinit 允许我们先声明一个变量,然后在程序执行周期的将来某个时候将其初始化,让编译检查时不会 因为属性变量未被初始化而报错。如果未初始化将导致以下异常:

kotlin.UninitializedPropertyAccessException: lateinit property mList has not been initialized

所以我们在 Kotlin 1.2及更高版本上,经常使用基于反射的API 快速检查lateinit属性是否已初始化。

private lateinit var mList: MutableList<String>

fun main(args: Array<String>) {
    if (::mList.isInitialized) {
        mList.add("")
    }
}

但如果我们在一个类中有一个lateinit属性,然后尝试在另一类中检查它是被初始化,如下所示:

class PreA{
    lateinit var mList: MutableList<String>
}

class PreB{
    val mPreA  = PreA()
    fun  print(){
        if (mPreA::mList.isInitialized){

        }
    }
}

会报错:

Kotlin: Backing field of 'var mList: MutableList<String>' is not accessible at this point

因为该反射API的限定,当然inner class 是被允许的,具体设计细节参考官方

所以我们如有类似需求可以直接在目标类中添加新方法来检查lateinit属性:

class PreA{
    lateinit var mList: MutableList<String>
    fun isListInitialised() = ::mList.isInitialized
}

class PreB{
    val mPreA  = PreA()
    fun  print(){
        if (mPreA.isListInitialised()){
            mPreA.mList.add("")
        }
    }
}

当然通过捕获UninitializedPropertyAccessException 异常也是可以

参考: StackOverflow

Image placeholder
coffey
未设置
  26人点赞

没有讨论,发表一下自己的看法吧

推荐文章
资源混淆是如何影响到Kotlin协程的

导言随着kotlin的使用,协程也慢慢在我们工程中被开始被使用起来,但在我们工程中却遇到了一个问题,经过资源混淆处理之后的apk包,协程却不如期工作。那么两者到底有什么关联呢,资源混淆又是如何影响到协

学习 nodejs+mongodb+koa2 写接口(二) koa2教程入门

一.hellokoa安装koa2#初始化package.json npminit #安装koa2 npminstallkoahelloworld代码constKoa=require('koa') c

Java 与 Kotlin 系列文章 (一):性能问题

随着对Kotlin越来越深入的了解,我发现市面上关于Kotlin方面,比较深入的资料几乎是0,所以我决定,将Kotlin各个方面的研究作为我的研究生课题,而性能问题往往是程序员最佳关注的内容,所以第

Fortinet的云安全观:上云≠安全 云安全市场或迎“又一春”!

近年来网络攻击事件频繁发生,企业对于网络安全的关注度已经到达前所未有的高度,如何保证业务的正常运转是每个企业最为关注的问题之一。而随着越来越多的企业将业务扩展到云端,云上安全问题也成为企业必谈的话题!

打好网络安全攻坚战 思科年度安全报告系列关注未知安全挑战

当网络攻击愈演愈烈,当勒索软件愈加嚣张,企业对于网络安全的重视程度稳步提升。网络安全在企业中的地位从没像今天这般高涨。但不可否认的是,即便企业提升了对网络安全的防护,但网络安全威胁依旧长期存在且愈加复

cnpm如何安装vue?

如何使用cnpm安装vue?步骤1:确保你电脑上安装了最新版本的Node.js。步骤2:安装淘宝镜像(国内使用npm速度很慢,可以使用淘宝定制的cnpm(gzip压缩支持)命令行工具代替默认的npm)

koala如何压缩css?

koala如何压缩css?koala是一个前端预处理器语言图形编译工具,支持Less、Sass、Compass、CoffeeScript,帮助web开发者更高效地使用它们进行开发。跨平台运行,完美兼容

第 10 节:复合类型-5. 指针 -- 指针与指针变量 7. 结构体指针变量

7.结构体指针变量我们前面定义了指针指向了数组,解决了数组引用传递的问题。那么指针是否可以指向结构体,也能够解决结构体引用传递的问题呢?完全可以。\ 下面我们先来看一下,结构体指针变量的定义:\\ 也

PHP 安全问题入门:10 个常见安全问题 + 实例讲解

相对于其他几种语言来说,PHP在web建站方面有更大的优势,即使是新手,也能很容易搭建一个网站出来。但这种优势也容易带来一些负面影响,因为很多的PHP教程没有涉及到安全方面的知识。 此帖子分为几部分

[PHP 安全] OWASP 维护的 PHP 安全配置速查表

介绍 这个页面的目的是为了帮助那些配置PHP和运行它的web服务器的人确保它的安全性。 下面你将找到有关php.ini文件的正确配置信息。 php.ini 下面的一些设置需要适应你的系统,特别是se

梆梆安全:做以结果为导向的安全服务商

作为国内领先的安全服务提供商,梆梆安全不谈概念,始终从基本出发,致力于解决客户的根本性问题。通过运用领先技术提供专业可靠的服务,为全球政府、企业、开发者和消费者打造安全、稳固、可信的安全生态环境,其用

云架构远没想象般安全 派拓网络五大建议助力云安全

当企业业务大量向云端转移,云上安全问题变得愈加严峻,如何保障云端业务的安全成为企业关注的重点问题之一。前不久,网络安全企业PaloAltoNetworks(派拓网络)发布了一份云安全报告,揭示亚太区大

周鸿祎:360回归企业安全 携手安全生态打好网络攻坚战

8月19日,主题为“应对网络战、共建大生态、同筑大安全”的第七届互联网安全大会在北京雁栖湖国际会展中心隆重开幕,来自国内外的百余位专家共同讨论全球网络安全的最新形势,从战略、产业和技术等多个层面,探讨

采用 PHP-quickorm/Captcha,用最快的速度在 PHP 语言下实现验证码功能

要调用起这个库,门槛十分低,但是建议满足以下几个条件: PHP5+ PHPGD扩展 Composer(非必须) 安装方法 首先我们花30秒来引入一下这个库,主要有以下两种方式。 其一、使用Comp

集成 think-ORM 的 symfony bundle thinkorm-bundle

thinkorm-bundleSymfonyThinkOrmBundle关于thinkorm-bundle允许在你symfony使用thinkorm.所安装$composerrequireccwwwo

使用 ES6 写 Koa Web 项目

完整代码:传送门我们node.js只是实现了部分ES6的语法,所以为了让我们ES6的代码能100%在node.js下执行,必须使用我们的babel把ES6代码编译成nodejs可执行的代码。node环

实现koa核心代码

导语:实现简单的koa核心代码,便于理解koa原理。顺便学习koa代码的那些骚操作。简单分析koa创建一个http服务,只绑一个中间件。创建index.js/**index.js*/ constKoa

Koa源码阅读

查看Koa,version@2.7源码,总共只有四个文件application.js、context.js、request.js、response.js;分别对应Koa应用入口、上下文环境、请求对象和

学习 nodejs+mongodb+koa2 写接口(一) 环境布置

一.环境准备最近在学用Nodejs写后端接口,了解到koa2是Nodejs的一个框架。可以快速开发后端接口,同时也能更快熟悉Nodejs以下是所需的环境node  v7.6+,可以用nvm或者n安装指

知道创宇杨冀龙:变被动为主动,引入黑客视角护航IOT安全

提到无锡,除了太湖的美你还能想到些什么?我想到的是物联网,作为大家公认的“物联网之城”,无锡的物联网产业发展迅猛。根据无锡市委领导介绍,无锡是目前全国唯一的国家传感网创新示范区,从2009年开始,无锡

Python可视化 | Seaborn5分钟入门(二)——barplot&countplot&pointplot

微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matp

估值 27.5 亿美元,GitLab“超车”GitHub

近日,知名代码托管平台GitLab宣布完成E轮2.68亿美元融资。据悉,本次融资由高盛银行和IconiqCappital牵头,包括YCombinatorContinuity基金。这可能是该公司上市前

Git 拉取 GitLab 分支上的项目

一、选择一个空文件夹用来储存克隆下来的项目,然后鼠标右键选择gitbashhere,然后输入命令gitclone+自己Git库的地址 二、从dev分支上更新代码 1.与远程仓库建立连接:gitremo

GitLab,是谁给了你歧视中国程序员的勇气?

GitLab安全漏洞不断,收集用户行为数据,今天又找到新的作死方法了。由谷歌投资的全球第二大开源代码托管平台GitLab在其官网上发布了一项声明,称他们决定为有权访问客户数据的团队成员启用“工作家庭国

Java并发编程,深入理解ReentrantLock

ReentrantLock简介ReentrantLock重入锁, 是实现Lock接口的一个类 ,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次