【发布时间】:2019-09-26 13:04:53
【问题描述】:
我正在组合现有的导入和导出功能,以便在连接被拒绝的情况下减少用户被告知连接被拒绝的次数。我正在调用的库具有单独的导入和导出功能,以及组合的导入/导出功能。导出函数需要要导出的文件列表,而组合函数自己计算出列表(并在内部使用此列表调用导出函数)。由于用户可以关闭导入或导出,因此我只想在必要时获取文件列表。
我想出了这个代码:
List<File> files;
if (mExport)
files = ListFiles();
if (mExport && mImport && files.size() > 0) // Error is on files
DoExportAndImport();
else if (mImport)
DoImport();
else if (mExport && files.size() > 0) // No error here
DoExport(files);
第二个if 语句被标记为错误Variable 'files' might not have been initialized(但不是最后一个)。
帮助我在这里推理:如果mExport 为真,则files 被初始化;但是如果mExport 是假的,那么第二个if 语句就会短路并且永远不会到达files,所以files 没有被初始化并不重要,因为它没有被使用。
我在这里忽略了什么,还是编译器无法解决这种情况?如果是后者,有没有办法告诉编译器把它关闭,我已经处理好了?
作为记录,在声明中初始化 files = new ArrayList<>() 确实使编译器静音,files = null 也是如此,尽管这显然会导致其他错误;但是初始化一个我知道永远不会被使用或以任何方式引用的值感觉就像是一种浪费。
【问题讨论】:
-
files = Collections.emptyList()可能是一个更好的“虚拟”初始化程序,因为它没有分配。
标签: java android lazy-evaluation lazy-initialization short-circuiting