我最近了解了const
关键字,但是我很困惑!我找不到const
和val
关键字之间的任何区别,我的意思是我们可以使用两者来创建一个不可变的变量,我是否还有遗漏的内容?
我最近了解了const
关键字,但是我很困惑!我找不到const
和val
关键字之间的任何区别,我的意思是我们可以使用两者来创建一个不可变的变量,我是否还有遗漏的内容?
const
是编译时常量。这意味着它们的值必须在编译时分配,而不像val
那样可以在运行时分配。
这意味着只能将字符串或基本类型赋值给const
,而不能赋值给函数或类构造函数的结果。
例如:
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
const val foo = "Hello world"
和val bar = "Hello world"
怎么样?它们是一样的吗? - Mathew Hanyconst
变量在编译期间会被完全内联。 - Luka Jacobowitzconst val
而不仅仅是 const
?在我看来,这种情况下 val
关键字完全是多余的,因为 const var
本身就是荒谬的。 - Eric Lloydconst val
时,const
是对 val
进行修饰的一个关键字,而不是一个独立的关键字。在 Kotlin 中,修饰符比关键字更为重要。类似的设计还有:注解/枚举/数据类
、私有变量
、内联函数
等。 - AroKotlin:
const val str = "hello"
class SimplePerson(val name: String, var age: Int)
转 Java(部分):
@NotNull
public static final String str = "hello";
public final class SimplePerson {
@NotNull
private final String name;
private int age;
@NotNull
public final String getName() {
return this.name;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
public SimplePerson(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}
}
const
,会产生不同的Java文件吗? - DYSSimplePerson
类的private final String name;
相比,@DYS的属性没有使用关键字const
,并且也是私有的。但这是因为它是作为一个成员变量而不是作为顶级/包变量存在,并不是因为const
关键字的原因。 - nobled将 Kotlin 转换为 Java
const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";
将 Kotlin 转换为 Java
val Car_1 = "BUGATTI" // final String Car_1 = "BUGATTI";
用简单的语言解释
示例1-
const val Car_1 = "BUGATTI" ✔
val Car_2 = getCar() ✔
const val Car_3 = getCar() ❌
//Because the function will not get executed at the compile time so it will through error
fun getCar(): String {
return "BUGATTI"
}
这是因为getCar()在运行时被评估并将值分配给Car。val
和 const
都是不可变的。
const
用于声明编译时常量,而 val
用于运行时常量。
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
val
不一定是不可变的。 - Tenfour04因为我读了很多书,所以认为“val”表示不可变:这绝对不是这种情况,只需看这个例子:
class Test {
var x: Int = 2
val y
get() = x
}
fun main(args: Array<String>) {
val test = Test()
println("test.y = ${test.y}") // prints 2
test.x = 4
println("test.y = ${test.y}") // prints 4
}
可悲的是,目前你只能通过const来实现真正的不可变性-但这仅在编译时有效。在运行时,你无法创建真正的不可变性。
val只是指“只读”,你不能直接更改此变量,只能间接地更改,就像我在上面的示例中所示。
对于那些想要知道在val
和const
之间哪个更合适或更有效的人:
对于字符串或任何原始数据类型,建议使用const val
而不是val
。因为val
将在运行时确定,所以当您的应用程序正在运行时,它将处理所有值。另一方面,const val
将在编译时更早地进行处理。因此从性能角度来看,const val
会产生更好的结果。
Kotlin 的 val
关键字是与 Kotlin var
关键字相对应的一种只读属性。另一种称之为只读属性的名称是 immutable
。
Kotlin 代码:
val variation: Long = 100L
Java的等价代码如下:
final Long variation = 100L;
我们可以使用const
关键字来定义不可变属性。对于在编译时已知的属性,我们会使用const
。这是二者之间的区别。请注意,const
属性必须在全局范围内声明。
Kotlin代码(在 playground 中):
const val WEBSITE_NAME: String = "Google"
fun main() {
println(WEBSITE_NAME)
}
Java代码(在playground中):
class Playground {
final static String WEBSITE_NAME = "Google";
public static void main(String[ ] args) {
System.out.println(WEBSITE_NAME);
}
}
val
,通过自定义 getter 或者作为委托属性,在多次调用时产生不同的结果,或者因为它是开放的并且在子类中具有 setter。 - Tenfour04我们通过一个例子来学习这个。
object Constants {
val NAME = "Amit"
}
const
关键字。NAME
的:fun testValWithoutConst() {
val name = Constants.NAME
}
现在,我们需要反编译这段代码。为此,我们需要将这个 Kotlin 源文件转换为 Java 源文件。
我们将得到以下输出:
public final void testValWithoutConst() {
String name = Constants.INSTANCE.getNAME();
}
输出结果符合预期。
上面的例子没有使用const
关键字。现在,让我们使用const
关键字。
为此,我们将修改Kotlin中的对象类Constants
如下:
object Constants {
const val NAME = "Amit"
}
const
。NAME
:fun testValWithConst() {
val name = Constants.NAME
}
public final void testValWithConst() {
String name = "Amit";
}
NAME
已被其值Amit
替换。const
的优点。