马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.1.1 摆脱静态实用类的束缚–顶级函数
- 我们都知道,作为一种面向对象的语言,Java要求将所有代码都写成类的方法
- 通常情况下,这样做效果很好,但在实际中,几乎每个大型项目
- 偶尔,一个操作会与两个不同类的对象一起工作
- 另有一些时候,虽然只有一个主对象
- 因此,你最终会得到不包含任何状态或实例方法的类—实用工具类
- JDK 中的 Collections 类就是一个很好的例子
- 要在开源项目中找到其他例子,请查找名称中包含 Util 的类
- 在 Kotlin 中,不必要创建那些毫无意义的类
- 相反,可以直接将函数放在源文件的顶层,任何类的外边
- 如果想从其他包中调用这些函数,仍然必要导入它们
- 创建一个名为 Join.kt 的文件,直接将 joinToString 函数放到 strings 包中
- package strings
- @JvmOverloads
- fun <T> joinToString(
- collection: Collection<T>,
- separator: String = ", ",
- prefix: String = "",
- postfix: String = ""
- ) : String {
- val result = StringBuilder(prefix)
- for ((index, elem) in collection.withIndex()){
- if (index > 0) result.append(separator)
- result.append(elem)
- }
- result.append(postfix)
- return result.toString()
- }
复制代码
- 如今,让我们看看编译成相同类的 Java 代码
- <1> 可以看到,Kotlin 编译器生成的类名与包含函数的文件名同等
- <2> 文件中的所有顶级函数都被编译为该类的静态方法
- <3> 因此, 从 Java 中调用该函数就像调用其他静态方法一样简单
- /* Java */
- package strings;
- public class JoinKt { // <1>
- public static String joinToString(// ... ) { // ... } // <2>
- }
- ===========================================================
- /* Java */
- import strings.JoinKt;
- // ...
- JoinKt.joinToString(list, ", ", "", ""); // <3>
复制代码 1.1.2 更改顶级声明所在的类名
- 默认情况下,编译器生成的类名与文件名相对应,并带有 Kt 后缀
- 要更改包含 Kotlin 顶级函数的生成类名称
- <1> 将其放在文件开头,包名之前
- <2> 此时在Java代码中导入时, 可以直接利用新定名"StringFunctions"
- @file:JvmName("StringFunctions") // <1>package strings
- @JvmOverloads
- fun <T> joinToString(
- collection: Collection<T>,
- separator: String = ", ",
- prefix: String = "",
- postfix: String = ""
- ) : String {
- val result = StringBuilder(prefix)
- for ((index, elem) in collection.withIndex()){
- if (index > 0) result.append(separator)
- result.append(elem)
- }
- result.append(postfix)
- return result.toString()
- }
- ======================================================import java.util.List;import strings.StringFunctions; // <2>public class Example { public static void main(String[] args){ System.out.println(StringFunctions.joinToString(List.of("1", "2"))); }}
复制代码 1.1.3 顶层属性
- 与函数一样,属性也可以放在文件的顶层
- 在类外部存储单个数据并不常见,但仍然很有用
- 例如,你可以利用 var 属性来计算某些操作的实行次数
- <1> 声明顶级属性
- <2> 改变属性的值
- <3> 读取属性的值
- var opCount = 0 // <1>
- fun performOperation() {
- opCount++ // <2>
- // ...
- }
- fun reportOperationCount() {
- println("Operation performed $opCount times") // <3>
- }
复制代码
- 顶级属性还答应在代码中定义常量: val UNIX_LINE_SEPARATOR = “\n”
- 默认情况下,顶层属性与其他属性一样
- 以访问器方法的形式暴露给 Java 代码的
- val 属性的 getter 和 var 属性的 getter-setter 对
- <1> 如果想将常量作为"public static final"字段暴露给 Java 代码
- 使其利用更自然,可以利用 const 修饰符对其进行标志
- <2> 与顶级函数一样,顶级属性在编译后会酿成Java的静态字段
- 由于这里利用const修饰属性,所以会得到"public static final"字段*
- const val UNIX_LINE_SEPARATOR = "\n" // <1>
- =============================================== // <2>
- /* Java */
- public static final String UNIX_LINE_SEPARATOR = "\n";
复制代码
- 注意 Kotlin 标准库还包含几个有用的顶级函数和属性
- kotlin.math 包就是一个例子
- <1> 例如用于计算两个数字最大值的 max 函数
- fun main() {
- println(max(PI, E)) // <1>
- // 3.141592653589793
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |