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

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

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

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

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

cnpm如何安装vue?

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

koala如何压缩css?

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

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

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

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

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

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

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

实现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

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

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

Java并发编程,深入理解ReentrantLock

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

我们可以不再使用ETL了吗?

近年来,我们在数据科学和高级分析方面取得了一些进步,但许多项目仍然采用20世纪80年代的遗留技术:萃取(extract)、转置(transform)和加载(load),也就是我们所说的ETL。这让数据

滴滴海量离线数据的在线化 — FastLoad

桔妹导读:滴滴自成立以来,有海量的数据存储在离线平台,离线数据虽然存储便宜,压缩比高,但不适用于线上使用。为此,我们提供了一键式DTS平台——FastLoad,帮助业务往在线存储系统搬运离线数据,目前

海量数据AtlasDB:把“数据库好用”这件事做到极致

导语:坚守初心、不辱使命,近期海量数据研发的企业级数据库AtlasDB获得了市场的普遍关注。这款以“好用”著称的国产数据库产品,不仅承载着海量数据公司对技术创新的坚持和投入,更凝结着一群拥有“工匠之心

技术宅告诉你如何搜索更安全

前言百度从14年开始就已经对外开放了HTTPS的访问,并于15年3月初正式对全网用户进行了HTTPS跳转。你也许会问,切换就切换呗,和我有啥关系?我平常用百度还不是照常顺顺当当的,没感觉到什么切换。话

如何在复杂的后端系统中保证数据库安全?

以技术为中心的时代,信息至关重要。数据库及其安全性已成为每个企业极具挑战性的任务。数据库可以包含关键信息,例如个人身份、信用卡信息、金融交易以及应用程序密码,这些都是对黑客和网络犯罪分子有价值的信息。

面对网络风险 企业应当如何部署安全策略?

有关数据泄露和漏洞的突发层出不穷,这些数据泄露和漏洞对企业的财务和声誉有着非常大的影响。企业高管似乎无法摆脱预警头条的抨击,以及由专家组成的轰炸,这些专家就如何避免这些网络安全攻击提出了一些建议。尽管

区块链如何改变当今的业务安全

区块链已经扩展到多个行业,正在颠覆商业世界。下面是区块链如何改变当今的业务安全性。对区块链技术的需求持续增长。全球区块链技术市场的规模预计将增长,到2023年最终将达到233亿美元:区块链已经攻克的行

如何创建安全的 Node.js GraphQL API?

本文的目标是提供关于如何创建安全的Node.jsGraphQLAPI的快速指南。你可能会想到一些问题:使用GraphQLAPI的目的是什么?什么是GraphQLAPI?什么是GraphQL查询?Gra

使用Certbot开启HTTPS访问(最新)

知乎地址友情链接 v-easy-components-基于Vue2.x的组件命令库 逸宿-一款预定民宿的webapp(毕设) 在线网易云API-基于NeteaseCloudMusicApi在线A