正确地使用 Kotlin 的 internal
发布时间:2025-05-22 13:52:05 发布人:远客网络
一、正确地使用 Kotlin 的 internal
1、内部使用的内部函数是 Kotlin的一个特性,允许仅在当前模块内部调用,但编译后仍可被 Java代码视为公开调用,这引发了争议。如何妥善解决这一问题呢?
2、其实,解决这个问题非常简单,只是我们之前可能没有发现。关键在于利用 Java语法的限制。
3、假设我们有一个 Kotlin内部函数。
4、如果 Kotlin编译器能感知到有 Java代码跨模块调用此函数,它将阻止编译。但若将函数定义封装在 jar文件中,完全脱离 Kotlin编译器的控制,Java将能随心所欲地调用。
5、此注解可让 Kotlin编译器在字节码中更改函数名,但代码中仍能使用原名。因此,使用@JvmName,并赋予 Java无法实现的函数名。
6、或者,如果你是 Haskell粉丝,不妨尝试更骚气的命名。
7、这样,调用此函数的权限将被 Kotlin独占。在 jar文件中引用时,函数名将变成@JvmName参数,这正是 Java无法实现的,只有 Kotlin可以使用。
8、这样一来,internal修饰符的目的便得以实现。
9、方法二:运用 Kotlin的骚命名技巧
10、我们知道, Kotlin允许使用 ` `将不合法的标识符合法化,即使本身合法也适用。我们通常仅在处理关键字冲突时使用此功能,但你可能没想到它还有这种妙用。
11、我们同样可以采用添加空格等方法来欺负 Java:
12、或者,如果你是 Haskell粉丝,不妨尝试更骚气的命名。
13、这些命名都是支持的。例如,在我的一个个人项目的一个文件中就使用了这种操作,当然不是为了 internal,只是为了让代码看起来更有趣。
14、顺便一提,在复制这篇文章内容时,谷歌翻译竟然将我的代码翻译了出来,"internal fun"变成了“内部的乐趣”,让人忍俊不禁。
15、这就是关于正确使用 Kotlin内部函数的分享。
二、kotlin和java开发android哪个好
初级工程师,2周Kotlin经验来分享我的视角:1.无缝的Java互调保证了不会出现什么绕不过的坑正式使用Kotlin之前尝试过Kotlin与DataBinding同用,但是在.kt文件中import DataBinding相关的类会编译报错,最后把所有与DataBinding相关的代码都放到.java中,在.kt中去调用。不了解Kotlin的反射与Java反射的差异,但是问题大概就是出在这里。2.Extension带来的语法糖,甜过初恋举个栗子,各种system service再也不用强制类型转换了,只需写一个context的extension即可。事实上Anko库已经提供了大量的写好的extension。再也不用为了获取一个简单的service对象需要强制类型转换而换行了。。。我吧一些application wide的东西都存为application的property,让后给context一个extension,以后任何context来获取这些service就是一个简单的读property了。3.Lambda衍生出来的Builder,最碉堡的是Anko库可以用Kotlin像写xml一样写洁面了,还有DSL preview插件帮你。。。这样写出来的洁面不但加载速度快(少了xml解析时间),配置各种view也是很方便的。但是使用lambda也是有坑的,有些以回调为key的方法是不可以使用匿名对象的,否则没法取消。例如蓝牙低功耗扫描时startLeScan(callback: LeScanCallback)stopLeScan(callback: LeScanCallback)这种,开始和结束是要同一个object的,所以不要使用lambda。其实这个很好理解,lambda很像匿名Runnable,只不过现在是一个获得了一等公民身份的方法。4.更多新一代语言的语法写起来很爽的,不多表5.工具链相对完整有个JetBrains的爹,插件更新紧跟语言版本。各路大神的加持,JakeWharton的好几个库都有Kotlin特别适配版,rx里面都有Kotlin版本了。。(事实上正在用RxKotlin,第一次使用rx)更多还在探索中。。。
三、Java与Kotlin中的深拷贝与浅拷贝
1、在编程中,当我们传递一个对象时,实际上传递的是对象的引用。如以下代码示例,s1与s2共用同一引用,即它们指向内存中的同一对象。
2、深拷贝与浅拷贝的区别在于拷贝层次。基本数据类型无区别,但若对象内部包含引用类型,浅拷贝只会复制引用,修改一个对象会直接影响到另一个;而深拷贝会创建新对象,避免引用影响。
3、在Java中,Object类的clone()方法默认提供浅拷贝。通过示例代码可以看到,修改s2的属性并未影响s1,说明实现了拷贝。但使用clone()方法时若对象内含引用类型,浅拷贝特性依然存在,修改一个对象会改变另一个。
4、Java中实现深拷贝可以通过覆盖clone()方法。如代码所示,新增的拷贝过程可实现深拷贝功能。然而,深拷贝的实现可能需要多层递归,具体实现方式多样。
5、Kotlin提供数据类(data class)自带的copy()函数默认实现浅拷贝。通过代码示例,我们发现copy()函数行为与Java中的clone()方法相似,实现了浅拷贝。
6、为了简化数据类的写法,Kotlin自动实现了toString()、equals()、hashCode()等方法,减少了重复代码量。Kotlin语法简洁,使得代码量减少,提高了编程效率。
7、Kotlin中实现深拷贝,通过在数据类中自定义copy函数即可。代码示例展示了如何实现这一过程。
8、总结深拷贝与浅拷贝的要点,以及学习更多高级实现方式的建议,是深入理解对象拷贝机制的关键。