确保在Kotlin中初始化val
在Java中我有以下方法:
public void doSomething() { final boolean promote = false; final String bob; if (promote) { try(StringWriter sw = new StringWriter()) { sw.write("this is a test"); bob = sw.toString(); } catch (IOException e) { e.printStackTrace(); throw new IllegalStateException(); } } else { bob = "anaconda"; } System.out.println(bob); }
当我把它转换成Kotlin时:
val promote = false val bob: String if (promote) { try { StringWriter().use { sw -> sw.write("this is a test") bob = sw.toString() } } catch (e: IOException) { e.printStackTrace() throw IllegalStateException() } } else { bob = "anaconda" } println(bob)
但是在最后一行我得到一个编译器错误: Variable 'bob' must be initialized.
当Java编译器非常确定变量已经被初始化或抛出异常时,我看不出Kotlin可能无法初始化bob
变量。
我唯一的选择是将bob
更改为var
并初始化它?
use
方法的结果赋值给变量,如下所示:
bob = StringWriter().use { sw -> sw.write("this is a test") sw.toString() }
Java编译器能够发现变量将被初始化,因为尝试使用资源是一种语言功能。 另一方面, use
方法是一个库特性,其行为取决于实际导入和使用的实现。 换句话说,Kotlin编译器无法知道函数是否作为参数传递,是否立即被调用。