companion object 的出现是为了解决 Java static 方法的反面向对象(Anti-OOP)的问题。...而 Scala 为了完成一切皆对象的使命,以及提高与 Java 的兼容性,提出了伴生对象这个概念来代替 static 方法。随后出身的 Kotlin 也借鉴了这个概念。...2. companion 的实现 在 Kotlin 中,调用 Java 的 static 方法和调用 Kotlin 的 companion object 方法是一样的: AJavaClass.staticFun...() AKotlinClass.companionFun() 而在 Java 中,调用 static 方法和 Kotlin 的伴生 companion object 方法,有一点不同: AJavaClass.staticFun...(); AKotlinClass.Companion.companionFun(); 从 Java 的调用我们可以发现,companion object 的 JVM 字节码体现,是一个声明了一个叫 Companion
Bug描述 今天我从别人的电脑上直接拷贝Eclipse文件夹到本地电脑的时候,启动会报 The Eclipse executable launcher was unable to locate its companion
一、前言 我们经常能够在 Java 相关技术博客中看到类似这样的文章: Java 中 X 种单例模式的写法。...就是单例模式的化身 object 可以实现 Java 中的匿名类 companion object 就是 Java 中的 static 变量 companion object 只能定义在对应的类中 但是...写了那么多 object ,我们再看看 companion object ,可谓是 object 的孪生兄弟,它可以说是为 Java 里的 static 而生的 object 。...它就像 Java 里的 static 变量,所以我们定义 companion object 变量的时候也一般会使用大写的命名方式。...我写这篇文章的时候我并没有下功夫继续深究,有机会还会再去看看转化 Java 部分源码,那样会更加加深对 object 和 companion object 甚至整个 Kotlin 语言的认识吧!
伴生对象中声明 ; 在 Java 中 调用 Kotlin 的 Companion 伴生对象 中的成员时 , 需要通过如下形式进行调用 : Kotlin类.Companion.成员属性 Kotlin类....Companion.成员函数 如果想要 在不使用 Companion 的前提下 直接调用 Kotlin 中的 Companion 伴生对象 成员 , 可以 在 companion object 中 ,..., 在 Java 语言中访问 Kotlin 伴生对象成员 , 需要先获取 Hello.Companion 类的伴生对象 , 然后再访问 伴生对象 中的成员 ; Kotlin 代码 : class Hello...伴生对象中 , 如果要访问 这两个成员 , 必须通过 Hello.Companion 进行访问 ; 2、Java 以静态方式访问 Kotlin 伴生对象成员 在下面的代码中 , 使用 @JvmStatic...注解修饰 Kotlin 中伴生对象中的成员 , 则可以在 Java 中 以静态方式访问这些成员 ; Kotlin 代码 : class Hello { companion object {
,一般用来代替 Java 的匿名内部类 下面就逐个来看看这三种用法的本质。...当然也不难解决,模仿 Java 的写法就行了,这里以 DCL 模式为例。...这里实例就是 User 类中定义的静态成员变量 Companion : public static final User.Companion Companion = new User.Companion...我们来反编译一下 User.MALE 的 Java 代码。 User.Companion.getMALE(); 所以也是访问时时会初始化伴生对象。...在 Java 中如何调用伴生对象呢?User.Companion.isMale(1) 即可。
var temp = "1" val temp2 = "2" const val temp3 = "3" } 抛出疑问:使用object修饰的类,是哪种类型的单例模式 这里我们先回顾一下java...this.field = field; } } 优点:线程安全,不用担心反射破话单例模式 缺点:枚举类占用内存多 解析:object 单例类是什么类型的单例 这里我们直接将kotlin代码转为Java...kotlin代码如下 转为Java之后 我们可以看到,该Model类转为Java代码之后,它是一个饿汉式单例。所以使用object的类采用的是饿汉式单例。...("11") } } class ApiWrapper (val api : String){ fun s() { } } java代码如下 public final...Companion = new Model.Companion((DefaultConstructorMarker)null); public static final class Companion
object : SingleTest(){ override fun play() = "other loading..." } println(p.play()) } companion...将某个对象的初始化和一个类实例捆绑在一起 一个类里只能有一个伴生对象 伴生对象只有一个,哪怕类初始化多次 只有在类实例化或是调用伴生对象的函数时,伴生对象才会初始化,才会加载到内存 伴生对象里的方法就类似Java...里的static方法的实现 //伴生对象 open class ConfigMap{ companion object{ private const val PATH = "xxx
点击 [Decompile] 按钮还可以直接反编译到 Java 。...编译之后 MutableList 变成了 Java 的原生类型 java.util.List 。...在 Java 程序中,对于每个类 CREATOR 有非常稳定的实现。假如上面的例子是用 Java 写的,由于我们已经有了一个以 Parcel 为参数的构造方法,我们只需要这样实现 CREATOR 。...CREATOR 不再占据整个 companion object ,而是只是作为 companion object 中的一个字段,代码干净了很多。...: T = T::class.java.getDeclaredConstructor(Parcel::class.java).newInstance(source) } 在每一个 Parcelable
在 Java 语言中,static 关键字主要用于表明方法和属性是属于某个对象,而不是属于对象的实例。...当您将 Java 的单例代码转换为 Kotlin 代码时,所有的静态属性和方法就会被移动到 companion object 中。
proto文件就是一个数据协议的描述文件,基于其中的类型信息会被转化成对应的语言(比如java go OC等等)。 proto的好处就是协议字段非常稳定,而且可被追溯。...所以官方proto提供的java类就没办法直接被kmp所引用到。 因为上述原因,所以我们现在急需的是一个proto插件,可以帮助我们把一个proto文件直接转化成kotlin的。...pbandk pbandk 仓库地址 这个库通过protobuf-java编写了一个proto插件。...verbatim from [protobufsrc]/examples/addressbook.proto except // some surrounding comments are removed and java...但是由于在类描述文件中使用了java8的语法糖,所以这个库的类数量会有点膨胀。导致了其输出的jvm library的体积会有点大。 我全要?
2、Kotlin中设计模式的实现和Java的实现在某些方面还是有很大的差别的,利用Kotlin语言自身的特性实现设计模式比硬生生套用Java中的设计模式实现要更优雅和更高效。...(),如果不加注解,在Java中必须这样调用: KLazilyDCLSingleton.Companion.getInstance()....如果硬生生把Companion对象暴露给Java开发者他们可能会感到一脸懵逼。...可能大家对lazy和Companion Object功能强大感到一脸懵,让我们一起瞅瞅反编译后的Java代码你就会恍然大悟了: public final class KLazilyDCLSingleton...();//这里可以看到加了@JvmStatic注解后,getInstance内部把我们省略Companion.getInstance()这一步,这样一来Java调用者就直接KLazilyDCLSingleton.getInstance
前言 在日常开发过程中,静态变量和 静态方法 是我们常见的用法,Java中相信大家并不陌生了,那么在 Kotlin 中该如何使用呢?...其实很简单,只需要一个将变量和方法包含在 companion object 域中即可,比如这样: class Constant { companion object { // 接口根地址 const...和kotlin混合开发,在Java代码中就无法通过 Constant.静态变量 的方式来使用静态变量或者方法来,而是通过如下方式: //初始化各平台的APIKey PlatformConfig.setWeixin...(Constant.Companion.WECHAT_APP_ID, Constant.WECHAT_APP_SECRET) PlatformConfig.setSinaWeibo(Constant.Companion.WEIBO_APP_KEY...我们可以借助于注解 @JvmField 和 @JvmStatic 来分别标注静态变量和静态方法,之后我就能在Java代码中像以前方式那样直接使用静态的成员啦!
前言 单利模式是写代码过程中不可避免用到的,下面我总结一下单利常用的五种写法,话不多说了,来一起看看详细的介绍吧 加载类时创建单利 Java实现 public class Config{ private...null==INSTANCE){ INSTSANCE=new Config(); } return INSTANCE; } } Kotlin实现 public class Config{ companion...){ if(null==INSTANCE){ INSTANCE=new Config(); } return INSTANCE; } } Kotlin实现 class Config{ companion...null==INSTANCE){ INSTSANCE=new Config(); } } } return INSTANCE; } } Kotlin实现 class Config{ companion...Config getInstance(){ return Helper.INSTANCE; } } Kotlin实现 class Config private constructor(){ companion
Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 V ....Java 中的懒汉式与恶汉式 ---- 1 ....Java 饿汉式 单例模式 : 在类第一次被调用就创建单例对象 ; package singleton.java; /** * 饿汉单例模式 * 在类第一次被调用就创建单例对象 */...Kotlin 中对应 Java 的懒汉式与恶汉式 ---- 1 ....Kotlin 伴生对象 ( companion object ) ---- 1 .
com.example.jvmannotationsample class Developer (@JvmField val name: String, val ide: String) 使用@JvmField,我们在Java...(); Sample.getTAG_NAME(); Sample.Companion.getNON_STATIC_VALUE(); Companion Kotlin中我们可以借助object实现静态的形式...,比如下面的代码 package com.example.jvmannotationsample class SomeClass { companion object {...的名称,如下代码 package com.example.jvmannotationsample class AnotherClass { companion object Assistant...{ fun scheduleSomething() { } } } 调用代码示例 //test companion SomeClass.Companion.getCommonProperties
Kotlin中的类 抽象类和接口 抽象类 跟Java一样,使用abstract关键字 open class Base{ open fun f(){} } abstract class Derived...java中调用方法时,提供的匿名内部类 fun countClicks(window:JComponent){ var clickCount = 0 val enterCount=0...companion object Factory{ fun create():MyClass=MyClass() } } //调用方式类似于Java中的静态方法 val instance...= MyClass.create() //如果按照下列写法,调用时,可以使用名称 Companion class MyClass{ companion object{} } val x = MyClass.Companion...更多详细的内容之后再看 class MyClassJVM { companion object : Factory { @JvmStatic override
在日常开发中,大家常用的语言还是Java,但今天我给大家带来的是在Kotlin语言中,单例模式是怎么编写的,并且会对比Java方式,下面话不多说了,来一起看看详细的介绍吧 一、懒人写法(恶汉式) java...instance = new Singleton(); } return instance; } } kotlin中 class Singleton private constructor{ companion...new Singleton(); } return instance; } } kotlin中 class Singleton private constructor(){ companion...Singleton(); } } } return instance; } } kotlin class Singleton private constructor(){ companion...Singleton getInstance(){ return Holder.instance; } } kotlin中 class Singleton private constructor(){ companion
前言 单利模式是写代码过程中不可避免用到的,下面我总结一下单利常用的五种写法,话不多说了,来一起看看详细的介绍吧 加载类时创建单利 Java实现 public class Config{ private...null==INSTANCE){ INSTSANCE=new Config(); } return INSTANCE; } } Kotlin实现 public class Config{ companion...{ if(null==INSTANCE){ INSTANCE=new Config(); } return INSTANCE; } } Kotlin实现 class Config{ companion...==INSTANCE){ INSTSANCE=new Config(); } } } return INSTANCE; } } Kotlin实现 class Config{ companion...Config getInstance(){ return Helper.INSTANCE; } } Kotlin实现 class Config private constructor(){ companion
这些特性使得Kotlin的代码比Java简洁优雅许多,提高了代码的可读性和可维护性,节省了开发时间,提高了开发效率。...Kotlin的隐藏开销 伴生对象 伴生对象通过在类中使用companion object来创建,用来替代静态成员,类似于Java中的静态内部类。...public static final class Companion { private static int access$getVersion$p(Companion companion...Kotlin声明的数组 等同的Java代码: ? 等同Java声明的数组 后面两种方法都对基本类型做了装箱处理,产生了额外的开销。...上面的for循环中结合使用了downTo和step,那么等同的Java代码又是怎么实现的呢? ?
} return single; } } Kotlin /** * 懒汉式 --- 非线程安全 */class Single private constructor() { companion...companion object的意思相当于Java中public static。 3. 懒汉式——线程安全(1) 因为懒汉式的出现,虽然解决了饿汉式的不足,但也出现了多线程的问题。...但因为使用synchronized关键字使加锁效率不高 * Kotlin使用@Synchronized注解加锁 */class Single private constructor() { companion...Kotlin /** * 懒汉式 --- 线程安全 双重校验锁 */class Single private constructor() { companion object {.../** * 内部类实现 */class Single private constructor() { companion object { fun getInstance():
领取专属 10元无门槛券
手把手带您无忧上云