Android 之 kotlin语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hl=zh-cn

一、Java(供 Kotlin 使用)

1、不得使用硬关键字

不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识符。

  • 硬关键字

    as、as?、break、class、continue、do、else、 false、for、fun、if、in、!in、interface、is、!is、null、object、package、super、this、throw、true、typealias、typeof、val、var、when、while。

  • 软关键字、修饰符关键字和特殊标识符
    https://kotlinlang.org/docs/keyword-reference.html#hard-keywords

2、避免使用 Any 的扩展函数或属性的名称

3、可为 null 性注释

  • 公共 API 中的每个非基础参数类型、返回类型和字段类型都应 具有可为 null 性注解。
  • 未加注解的类型会被解释为 "平台"类型,这些类型是否可为 null 性不明确。

4、Lambda 参数位于最后

  • 符合 SAM 转换条件的参数类型应位于最后。例如,RxJava 2 的 Flowable.create() 方法签名定义为:
cpp 复制代码
	public static <T> Flowable<T> create(
	    FlowableOnSubscribe<T> source,
	    BackpressureStrategy mode) { /* ... */ }
	
	// 在 kotlin 中调用时显示为
	Flowable.create({ /* ... */ }, BackpressureStrategy.LATEST)
  • 如果方法签名中的参数颠倒顺序,则函数会调用 可以使用尾随 lambda 语法:
cpp 复制代码
	public static <T> Flowable<T> create(
	    BackpressureStrategy mode,
	    FlowableOnSubscribe<T> source) { /* ... */ }
	
	// 在 kotlin 中调用时显示为
	Flowable.create(BackpressureStrategy.LATEST) { /* ... */ }

5、属性前缀

  • 对于在 Kotlin 中要表示为属性的方法,需要严格的**"bean"样式** 前缀。
  • 访问器 方法需要 get 前缀 ;对于布尔值返回 方法,则为 is 前缀。
  • 更改器 方法需要 set 前缀
  • 如果希望方法作为属性公开 ,请不要使用非标准前缀,例如 has、set 或无 get 前缀的访问器。带有非标准前缀的方法 也可作为函数进行调用,具体取决于 方法的行为。
kotlin 复制代码
	public final class User {
		public String getName() { /* ... */ }
		public void setName(String name) { /* ... */ }
		public boolean isActive() { /* ... */ }
		public void setActive(boolean active) { /* ... */ }
	}
	
	// 对应的 kotlin 代码
	val name = user.name // Invokes user.getName()
	val active = user.isActive // Invokes user.isActive()
	user.name = "Bob" // Invokes user.setName(String)
	user.isActive = true // Invokes user.setActive(boolean)

6、运算符过载

  • 允许特殊调用点语法。
kotlin 复制代码
	public final class IntBox {
		private final int value;
		public IntBox(int value) {
			this.value = value;
		}
		public IntBox plus(IntBox other) {
			return new IntBox(value + other.value);
		}
	}
	
	// kotlin 代码
	val one = IntBox(1)
	val two = IntBox(2)
	val three = one + two // Invokes one.plus(two)

二、Kotlin(供 Java 使用)

1、文件名

  • 如果文件包含顶级函数或属性,请始终为其添加注解 使用 @file:JvmName("Foo") 提供一个好记的名称。
  • 默认情况下,MyClass.kt 文件中的顶级成员最终将位于名为 MyClassKt 文件中,该名字没有吸引力,并且会泄露作为实现的语言 。
  • 建议您添加"@file:JvmMultifileClass",它是 Kotlin 中的一个注解,用于支持将一个 Kotlin 文件拆分成多个部分,这些部分在 Java 中被视为同一个类的一部分。
  • 使用 @file:JvmMultifileClass 注解时,通常会结合 @file:JvmName 注解来指定生成的 Java 类的名称。这样,多个 Kotlin 文件可以合并成一个 Java 类,而不会出现命名冲突。

2、Lambda 参数

  • 使用 Java 定义的单一方法接口 (SAM) 可以用 Kotlin 语言实现,也可以使用 lambda 语法的 Java 语言以惯用方式内嵌实现。

(1)首选定义

  • 要在 Java 中使用的高阶函数 ,不应接受会返回 Unit 的函数类型 ,而建议使用功能 (SAM) 接口
  • 即使函数类型不会返回 Unit,仍建议您将其设为命名接口,以便调用方使用命名类来实现它,而非只使用 lambda(在 Kotlin 和 Java 中)。
  • 在定义预期用作 lambda 的接口时,优先考虑使用功能 (SAM) 接口,而不是常规接口 ,用以支持 Kotlin 中的惯用用法。
cpp 复制代码
// 高阶函数,函数类型为 (String) -> Unit
fun sayHi(greeter: (String) -> Unit)

// 建议使用 SAM 接口
fun interface GreeterCallback {
	fun greetName(String name)
}
fun sayHi(greeter: GreeterCallback) = /* ... */

// kotlin 中调用
sayHi { println("Hello, $it!") }

// java 中调用
sayHi(name -> System.out.println("Hello, " + name + "!"));

// 实现接口的命名类
class MyGreeterCallback : GreeterCallback {
	override fun greetName(name: String) {
		println("Hello, $name!");
	}
}

(2)避免使用会返回 Unit 的函数类型

  • 返回 Unit 的函数类型要求 Java 调用方返回 Unit.INSTANCE
cpp 复制代码
	// kotlin
	fun sayHi(greeter: (String) -> Unit) = /* ... */
	
	// 对应的 java 调用
	sayHi(name -> {
	  System.out.println("Hello, " + name + "!");
	  return Unit.INSTANCE;
	});

(3)如果实现应具有状态,请避免使用功能接口

相关推荐
BillKu31 分钟前
Java + Spring Boot + Mybatis 实现批量插入
java·spring boot·mybatis
YuTaoShao32 分钟前
Java八股文——集合「Map篇」
java
dog shit1 小时前
web第十次课后作业--Mybatis的增删改查
android·前端·mybatis
有梦想的攻城狮3 小时前
maven中的maven-antrun-plugin插件详解
java·maven·插件·antrun
科技道人3 小时前
Android15 launcher3
android·launcher3·android15·hotseat
硅的褶皱6 小时前
对比分析LinkedBlockingQueue和SynchronousQueue
java·并发编程
MoFe16 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore
季鸢7 小时前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
Fanxt_Ja7 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
CYRUS_STUDIO7 小时前
FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
android·安全·逆向