SingleTest(){ override fun play() = "other loading..." } println(p.play()) } companion伴生对象...将某个对象的初始化和一个类实例捆绑在一起 一个类里只能有一个伴生对象 伴生对象只有一个,哪怕类初始化多次 只有在类实例化或是调用伴生对象的函数时,伴生对象才会初始化,才会加载到内存 伴生对象里的方法就类似...Java里的static方法的实现 //伴生对象 open class ConfigMap{ companion object{ private const val PATH =...() } internal internal 修饰类的方法,表示这个类方法只适合当前module使用,如果其他module使用的话,会找不到这个internal方法或者报错.所以 internal 限制了跨...module 的方法的使用 码字不易,求转发,求点在看,求关注,感谢!
之前的文章Java并发BUG基础篇中提到过线程安全的集合类如CopyOnWriteArrayList、ConcurrentHashMap等的使用,以及线程安全类的几种创建方法: Map<String,...下面是我写的一个Demo,为了验证一个问题:如何在线程安全的类中存放不安全的对象,那么对于集合中对象的访问是线程安全的吗?...下面是我测试在集合中存放不安全的对象的Demo: package com.fun import com.fun.base.constaint.ThreadLimitTimesCount import...JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ INFO-> INFO-> 8 Process finished with exit code 0 最后输出结果是8,可见:在线程安全集合中存放的非线程安全类依然是不安全的...在并发状况下,可能会有多个线程进行数组拷贝时使用的是一个size,index是固定的,因为之前访问这个list的线程并没有完成对size的修改赋值。
Kotlin 的类特性 写了两篇 PWA 了,今天继续讲回 Kotlin。 Kotlin 中有很多非常好的特性,扩展方法、伴生对象、原生支持动态代理、伪多继承。今天来详细讲讲。...强转与智能转换 在 Kotlin 中,用 is 来判断一个对象是否是某个类的实例,用 as 来做强转。...Kotlin 有一个很好的特性,叫 智能转换(smart cast),在我之前的文章中也提到过。就是当已经确定一个对象的类型后,可以自动识别为这个类的对象,而不用再手动强转。...animal as Dog).bark() } } 伴生对象 在上一篇 Kotlin 与 Java 互转 中 我们提到这样一段工具类代码 class StringUtils { companion...以下代码将线程安全问题交给虚拟机在静态内部类加载时处理,是一种推荐的写法: class Single private constructor() { companion object {
对象声明 —— 一个关键字实现单例 ? 伴生对象 —— static 的代替者 ? 对象表达式 —— Kotlin 的匿名内部类 ? 这到底是哪种用法 ?...私有构造函数 通过静态字段对外提供实例 静态代码块中直接初始化,线程安全 。 这里插播一个问题,static 代码块在何时执行?...同时,由于类加载过程天生线程安全,所以 Kotlin 的 object 单例活脱脱的就是一个线程安全的懒汉式单例(访问时初始化)。...通常我们可以在顶层文件中直接定义常量和顶层函数,但有的时候我们的确需要在类中定义静态常量或函数,这样显得更加直观。这就是 伴生对象 的应用场景。...再回想一下前面说过的, object 其实我们可以把它理解成 定义一个类并创建一个实例 。 伴生对象仍旧符合这一语义。 在 Java 中如何调用伴生对象呢?
发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系。 什么是发布?...简单来说就是提供一个对象的引用给作用域之外的代码。比如return一个对象,或者作为参数传递到其他类的方法中。 什么是逸出?...如果一个类还没有构造结束就已经提供给了外部代码一个对象引用即发布了该对象,此时叫做对象逸出,对象的逸出会破坏线程的安全性。 概念我们知道了,可我们要关注什么地方呢?...,而是使用工厂方法,在工厂方法newInstance中待构造函数执行完毕后再将对象进行发布(代码中即为registenerListener注册监听)。...这实际上就是修改为了构造完毕->发布对象的串行执行模式,而不是之前的异步模式,这样就不会给我们带来线程安全性的问题。
Kotlin的隐藏开销 伴生对象 伴生对象通过在类中使用companion object来创建,用来替代静态成员,类似于Java中的静态内部类。...所以在伴生对象中声明常量是很常见的做法,但如果写法不对,可能就会产生额外开销。...访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主类的静态方法 读取主类中的静态字段 为了访问一个常量,而多花费调用4个方法的开销,这样的Kotlin...对于其他类型的常量,最好在它们自己的主类对象而不是伴生对象中来存储公共的全局常量。...lazy()默认情况下会指定LazyThreadSafetyMode.SYNCHRONIZED,这可能会造成不必要线程安全的开销,应该根据实际情况,指定合适的model来避免不需要的同步锁。
2 尽量地使用val val 是线程安全的,并且不需要担心 null 的问题,我们自然应该尽可能地使用它。...大家也要尽量的避免这种情况。 3 应该好好注意一下伴生对象 伴生对象通过在类中使用 companion object 来创建,用来替代静态成员,类似于 Java 中的静态内部类。...所以在伴生对象中声明常量是很常见的做法,但如果写法不对,可能就会产生额外开销。...访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主类的静态方法 读取主类中的静态字段 为了访问一个常量,而多花费调用4个方法的开销,这样的 Kotlin...对于其他类型的常量,最好在它们自己的主类对象而不是伴生对象中来存储公共的全局常量。
Hi, 你好,很高兴见到你 引言 Kotlin 是一个非常 yes 的语言,从 null安全 ,支持 方法扩展 与 属性扩展,到 内联方法、内联类 等,使用Kotlin变得越来越简单舒服。...伴生对象,也许真的不需要 在 Kotlin 中,我们不能像 Java 一样,随便定义一个静态方法或者静态属性。此时 companion object(伴生对象)就会派上用场。...Book 类中增加了一个伴生对象,其中有一个静态的字段 SUM_MAX。...作用也相对直接,如果我们有某个对象或字段,我们可能只想使用时再初始化,此时就可以先声明,等到使用时再去初始化,并且这个初始化过程默认也是线程安全(不特定使用NONE)。...上述使用了 默认的lazy ,即同步锁,而Android默认线程为 UI线程 ,当前操作方法又是 onCreate() ,即当前本身就是线程安全。
调用上面集合的方式如下: 6,伴生对象 Kotlin中没有静态属性和方法,如果我们要创建单列,可以使用Object关键字声明类。...如果要在一个类里面声明静态成员,可以在类的内部使用伴生对象,伴生对象使用关键字companion object。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...2,泛型 泛型的存在主要是为了消除模板代码和类型转换安全, 在Kotlin中泛型的使用基本与Java是一致的。...6.2.3 静态解析 6.2.4 扩展属性 6.2.5 扩展伴生对象 6.2.6 扩展的作用域 6.2.7 类中声明扩展 6.3 this表达式 6.5 小结 第7章 数据类与密封类 7.1 数据类
---- Kotlin 基于 Java 的空指针提出了一个空安全的概念,即每个属性默认不可为 null。...lazy 只能用于修饰常量 val,并且 lazy 是线程安全的。 lazy 在第一次被调用时就被初始化,以后调用该属性会返回之前的结果。...伴生对象的总结 ---- 类似于 Java 中使用类访问静态成员的语法。因为 Kotlin 取消了 static 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。...可见,伴生对象的主要作用就是为其所在的外部类模拟静态成员。 注意: 每个类可以最多有一个半生对象; 使用 const 关键字修饰常量,类似于 Java 中的 static final修饰。...首先伴生对象中的代码是在类加载时就会执行。init代码块中的方法会按顺序放在主构造函数中,主构造函数中原来的代码会在后面执行。 9. const 和 val 有什么区别?
自定义 Getters/Setters Kotlin 会自动的使用 getter/setter 模型,但也有一些情况(倒如 Json)我们需要用自定制 getter 和 setter。...Companion Object(伴生对象) Kotlin 是没有静态变量与方法的。相对应的,可以使用伴生对象。伴生对象允许定义的常量和方法,类似于 Java 中的 static。...Safe Typecasting(安全转换) 在 Android 中需要安全类型转换。...invoke(this) 16. with 函数 with 是一个非常有用的函数,它包含在 Kotlin 的标准库中。它接收一个对象和一个扩展函数作为它的参数,然后使这个对象扩展这个函数。...有一些解决方案,如 Butterknife 库,可以节省很多代码,但是 Kotlin 采取另一个步骤,允许您从一个导入的布局导入对视图的所有引用。 例如,这个 XML 布局: <?
由于 Kotlin 在编程范式上吸收了部分函数式编程的特性,因此 Kotlin/Native 的同步方案从设计思想上向函数式编程靠拢,即对象不变性,其宗旨就是如果对象本身不可变,那就不存在线程安全的问题...2.2 Worker 的基本用法 下面我们来看看如何在 Kotlin/Native 中开启子线程进行异步计算。...,因此在 Kotlin/Native 中,单例与全局变量有着特别的规则。...: 1 0 被添加了 @ThreadLocal 注解的全局变量会在每个线程中维护一个单独的副本,即在线程中对其进行修改对于其他线程是不可见的。...四、总结 在本文中我们一共体验了两套 Kotlin/Native 中实现异步与并发的方式,Worker-对象子图模式虽然可以确保并发安全,但是其做法较为粗暴,但目前来说 Worker-对象子图模型仍然是较为成熟的一套实现异步与并发的机制
不需要findviewbyid 最新版 AS build.gradle 中默认引入 apply plugin: 'kotlin-android-extensions' 所以在代码中直接引用布局中的id...设计模式 java写项目的时候我们使用MVP模式会使用RxJava,那么Kotlin也有对应的RxKotlin,同样可以使用MVP模式进行开发 单例 Kotlin中单例可以采用如下方式 //私有构造 class...Test private constructor(){ //伴生对象 companion object{ //by lazy 是线程安全的 val instance...:Test by lazy { Test() } } } 自定义View Java中代码里自定义View需要继承控件类并实现构造方法,在Kotlin中可以使用@JvmOverLoads constructor...,IDE会自动帮我们实现好构造 好了,这是我最近对Kotlin学习的一点总结,抽空看看写一个小项目,加油(ง •_•)ง
抽象类 7.2.1.2 接口 7.2.1.3 枚举 7.2.1.4 注解 7.2.1.5 静态类与伴生对象 7.2.1.6 sealed 密封类 7.2.1.7 data 数据类 7.2.1.8...类的实例对象 7.3.1 新建对象 7.3.2 对象属性(数据结构) 7.3.3 对象行为(算法函数) 7.4 委托 7.4.1 类的委托 7.4.2 属性的委托 第8章 函数式编程(FP)...的缺点 9.2 Kotlin与Java互操作 9.2.1 Kotlin无缝调用第三方jar库 9.2.2 执行shell 9.2.3 文件操作 9.2.4 多线程代码 9.3 Kotlin与Java...的区别 9.3.1 void 与 Unit 9.3.2 反射获取类的 Class 9.3.3 Java 与 Kotlin 关键字冲突的处理 9.3.4 static 方法与伴生对象companion...10.2.1 类型参数 10.2.2 类型推测 10.2.3 协变与逆变 10.3 类型上下界 第11章 轻量级线程:协程(Coroutines) 11.1 协程概念 11.2 协程的基本操作
单例的懒汉式与恶汉式 II . Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 V ....Kotlin 中对应 Java 的懒汉式与恶汉式 ---- 1 ....Kotlin 饿汉单例模式 : Kotlin 饿汉单例模式很简单 , 一行代码即可实现 , 该行代码的作用等同于上面的 Java 中的 Student 饿汉式单例模式的一坨代码 ; package singleton.kotlin...Kotlin 懒汉单例模式 : 该示例中涉及到了伴生对象 , 字段 getter 方法定义 , ? 和 !!...继承特征 : object 修饰的单例类 , 可以继承其它类 ; 4 . object 声明的单例类对象调用 : 直接使用类名 Student 调用即可 , 该类名等同于单例对象 , 如调用上述单例类的
spellBook.handleWithDefault(); } } @JvmStatic @JvmField注解还能用来以静态方式提供伴生对象里定义的值 @JvmStatic...注解的作用类似于@JvmField,允许你直接调用伴生对象的函数 //互操作 class SpellBook { @JvmField val spells = "hello world"...public static void main(String[] args) { SpellBook spellBook = new SpellBook(); //伴生对象属性的调用方式...// spellBook.Companion.getMAX_SPELL_COUNT(); //伴生对象的属性加了@JvmField修饰以后 int result...这样用户就指定怎么正确处理任何异常了 kotlin中抛出的异常会被转换成Throwable,Java中会catch不了。
声明类型 函数 操作符 数组遍历及控制语句 类与枚举 扩展 代理 伴生对象 单例模式 扩展学习 1 优势 简洁 它大大减少你需要写的样板代码的数量。 安全 避免空指针异常等整个类的错误。...2 配置 在我们的AndroidStudio开发工具中,要想使用Kotlin这个优秀的开发语言,我们需要安装插件,直接在安装插件界面搜索Kotlin然后安装。...,Kotlin还提供了指定类型的Array,如ByteArray,CharArray,ShortArray,IntArray,LongArray,FloatArray,DoubleArray,BooleanArray...10 扩展 使用 11 代理 12 伴生对象 伴生对象(companion object )类似于java中的静态关键字static。...在Kotlin没有这个关键字,而是伴生对象,具体用法 使用的话直接People.ID。 13 单例模式 在Kotlin中使用object修饰类的时候,该类是单例对象。
类 本篇文章主要介绍类的继承,接口,复写,单例,以及object属性的介绍。继承Kotlin中的继承方式与Java类似,Java中所有对象都继承自,而Kotlin中所有对象均继承自。...需要注意的是: 数据类主构造函数至少有一个参数 主构造函数的所有参数需要标记为或; 单例声明在Java中写一个单例是很麻烦的事情,也有很多种不通过的写法,需要考虑多线程问题,但在Kotlin中单例就变得简单的多...对象表达式 当需要修改一个类的部分功能,可以不通过显式实现一个该类的子类方式来实现。在Java中,通过匿名内部类来实现;在Kotlin中,概括为对象表达式和对象声明。...最常见的就是我们代码中设置Listener。示例如下: 还有这种用法 伴生对象Kotlin中没有静态的属性和方法的概念, Kotlin官网建议我们使用包级别的函数,来替代静态方法。...当然也可以在类内使用关键字声明一个伴生对象。 如下: 的使用有很多种,可参考这篇文章。
是两种类型,前者修饰的变量不可为 null 空值;后者加了 “?” 之后修饰的变量就可以为 null 了,这也是 kotlin 空安全的一种体现。...Kotlin 是空安全的。Kotlin 如果调用了 Java 中的代码,则需要用 ***? 的类型来接收,这样可以防止空指针异常。...扩展函数 kotlin 支持给原有的类添加一些扩展的功能,就是通过扩展函数来实现的。可以针对第三方库中对象添加一些我们需要的方法。...前三种与 Java 相同,internal 表示 module 模块内部是都可以访问的,而其他 module 是无法访问的。 4. Kotlin 的伴生对象。...可以实现静态方法和静态变量: class StringUtils { // 伴生对象 companion object { // 伴生对象实现静态变量 val
这有几个原因: 名称遮蔽 类型推断 编译时空值安全 类字面量 相反的类型声明 伴生对象 集合文字面量 Maybe? 不 数据类 开放类 陡峭的学习曲线 ? 名称遮掩 ?...似乎Java互操作性破坏了Kotlin的杀手特性——类型推断。看起来您应该显式地声明类型(如T?),以满足由Java方法填充的所有Kotlin变量。 ? 类字面量 ?...换句话说,你得手工输入完整的变量名。 ? ? 伴生对象 ? 一个 Java 程序员来到 Kotlin 阵营。 “嗨,Kotlin。我是新来的,有静态成员可用吗?”他问。 “没有。...我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录器,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“它是与类绑定的一个单例对象。你可以把日志记录器放在伴生对象中,” Kotlin 如此解释。 “明白了。是这样吗?” ? “对!
领取专属 10元无门槛券
手把手带您无忧上云