【发布时间】:2021-03-03 16:49:27
【问题描述】:
总结
我正在看一个场景,例如:
File someFile = null;
try
{
someFile = File.createTempFile( SOME_PREFIX, SOME_SUFFIX, targetDirectory );
}
catch( IOException e )
{
throw new SomeException( "Unable to create file for domain specific task", e, SomeExceptionErrorCode.FILE_MANAGEMENT_ERROR );
}
try( BufferedOutputStream stream = new BufferedOutputStream( new FileOutputStream( someFile.getAbsolutePath() ) ) )
{
stream.write( byteData, 0, byteData.length );
stream.flush();
}
catch( IOException e )
{
throw new SomeException( "Unable to write domain specific data to domain specific file", e, SomeExceptionErrorCode.FILE_MANAGEMENT_ERROR );
}
对于这种情况,someFile 被初始化为 null。我的目的是将这段代码翻译成遵循正确做法的东西。
我的考虑
- 只需将
someFile初始化为null即可,如当前代码sn-p所示。但是通常我会避免这种情况,所以到目前为止这似乎并不令人满意 - 用一个空的
String例如初始化someFile。这提供了File的默认实例。我看到的问题是,如果这个错误处理在未来发生变化,一个带有废话属性的有效File可能会被传递到代码中的其他地方。 - 嵌套
try-catch块。这确实有效,但是出于某种原因感觉很糟糕,尤其是因为两个嵌套块都捕获了IOException - 还考虑了一个
Optional<File>,但是我不相信如果每个try-catch块初始化了一个有点复杂的对象以在该块之外使用,是否证明使用Optional是合理的
问题
将someFile 初始化为null 是一种反模式吗?如果是这样,如何处理最好的场景,例如发布的场景?
【问题讨论】:
-
您可以简单地省略
= null部分。File someFile;在此上下文中有效。 -
两个答案都非常适合我的情况,谢谢。请注意,从技术上讲,这个问题仍然没有答案。虽然这些答案确实帮助我改进了我的代码,但关于使用
null初始化变量是否是不好的做法这一普遍问题尚未得到解答。 -
最初我想在没有任何上下文的情况下放置这个问题,但是没有上下文的单行词往往会引起负面关注,这就是为什么我提供了我想要解决的明确场景。
-
使用
null初始化通常不是坏习惯。它是语言的基本部分。另一种方法是:将 everything 包装在Optionals 中。我会说 this 是一种不好的做法,因为它会使代码更加难以阅读。这就是代码中最重要的部分:它应该很容易理解!...另一件要提的事情:使用null进行初始化然后覆盖它会告诉编译器这个变量不是“实际上是最终的”。虽然它不能在 lambda 表达式中使用。也许(只是猜测)它也会阻止编译器优化。