在 Kotlin 中,val
和 const val
都用于声明不可变的变量,但它们的行为和使用场景有明显差异。下面是它们的区别以及如何转换成 Java 的写法。
一、Kotlin [val]
✅ 含义:
运行时只读变量。
📌 特点:
- 在运行时赋值。
- 可以是类属性、局部变量等。
- 不是编译时常量。
- 不会被内联。
示例 Kotlin:
val PI = 3.1415
object Config {
val VERSION = "1.0.0"
}
等价 Java 写法:
public final double PI = 3.1415;
如果是对象中的属性:
public final class Config {
private static final String VERSION = "1.0.0";
public static final Config INSTANCE = new Config();
private Config() {}
public final String getVERSION() {
return VERSION;
}
}
二、Kotlin const val
✅ 含义:
编译期常量(compile-time constant)。
📌 特点:
- 必须在编译期确定值。
- 只能在顶层或
object
中声明。 - 类型只能是基本类型或
String
。 - 被内联到调用处。
示例 Kotlin:
const val APP_NAME = "MyApp"
object Config {
const val MAX_RETRY = 3
}
等价 Java 写法:
public static final String APP_NAME = "MyApp";
如果是对象中的属性:
public final class Config {
private static final int MAX_RETRY = 3;
public static final Config INSTANCE = new Config();
private Config() {}
public final int getMAX_RETRY() {
return MAX_RETRY;
}
}
但在调用处可能直接被替换为字面值:
System.out.println(3); // 内联效果
三、对比总结表
特性 | [val] | const val |
---|---|---|
是否编译时常量 | ❌ 否 | ✅ 是 |
初始化时机 | 运行时 | 编译时 |
支持类型 | 所有类型 | 基本类型、String
|
使用位置 | 可在类中、函数中等 | 必须是 top-level 或 object |
是否被内联 | ❌ 否 | ✅ 是 |
Java 等价写法 |
final 字段 |
public static final 字段 |