在Java中,有一种做法是声明每个变量(本地或类),如果确实是参数final.
虽然这使得代码更加冗长,但这有助于轻松阅读/掌握代码,并且还可以防止错误,因为意图已明确标记.
您对此有何看法,您对此有何看法?
在Java中,您可以使用final关键字限定局部变量和方法参数.
public static void foo(final int x) {
final String qwerty = "bar";
}
Run Code Online (Sandbox Code Playgroud)
这样做会导致无法在方法体中重新分配x和qwerty.
这种做法使你的代码向不变性的方向推动,这通常被认为是一个加分.但是,它也会使代码混乱,"最终"出现在各处.您对Java中的局部变量和方法参数的final关键字有何看法?
可能重复:
何时应该使用final?
final除非必要,否则我倾向于声明所有变量.我认为这是一个很好的做法,因为它允许编译器检查标识符是否按预期使用(例如,它没有变异).另一方面,它使代码混乱,也许这不是"Java方式".
我想知道是否存在关于最终变量的非必要使用的普遍接受的最佳实践,以及是否应该了解该讨论的其他权衡或方面.
我有一个变量,它不应该在初始化后改变它的值,所以我想把它定义为最终变量.
问题是变量必须在try块内初始化,所以我遇到以下麻烦:
我有以下代码:
Connection conn = null;
try {
conn = getConn(prefix);
[...do some stuff with conn...]
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
} finally {
closeConnection(conn);
}
Run Code Online (Sandbox Code Playgroud)
如果我将变量声明为final,而不将其初始化为null,则会在finally块上得到"局部变量conn可能尚未初始化".另一方面,如果我将其声明为final并将其初始化为null,则会在try块中收到错误"无法分配最终局部变量conn".
编辑:在lxx回答后,我来到这个版本
try {
final Connection conn = conn = getConn(prefix);
try {
return selectAll(conn, sql, params);
} catch (Exception e) {
throw new DbHelperException("error executing query", e);
} finally {
closeConnection(conn);
}
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
}
Run Code Online (Sandbox Code Playgroud)
那应该是这样做的方法吗?
- …
我的开发团队已经开始使用Mockito,并且已经将类定义为"final".我已经在Joshua Bloch和SO线程中阅读了Effective Java.何时使用final,所有类都应该使用final修饰符.线程中存在一些分歧,但我同意强制类组合的想法,除非继承有意义.
当我想使用像Mockito这样的测试框架来测试类时,我需要做什么才能让类没有'final'修饰符? 我希望其他人在开发过程中遇到过类似的问题.您的开发团队已达成哪些决议?
有两个明显的答案,比如使用JMock或删除我们想要测试的类的'final'修饰符,但我们想要坚持使用一个外部测试框架(除了JUnit),并且可能很难说服其他开发人员删除'final'修饰符.
谢谢.
我有以下代码:
public class BookLib {
void f() {
final int x = 5; // Line 1
class MyCLass {
void print() {
System.out.println(x);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在这种情况下使用最终变量(第1行)?
可能重复:
何时使用final
final为对象
声明关键字有什么用?例如:
final Object obj = new myclass();
Run Code Online (Sandbox Code Playgroud) 可能重复:
何时应该使用final?
Java程序员何时应该使用
final Date now = new Date();
Run Code Online (Sandbox Code Playgroud)
过度
Date now = new Date();
Run Code Online (Sandbox Code Playgroud) 我正在使用Android Studio开发Android应用程序,并运行了代码分析.在许多不同的代码片段中,分析表明了一些变量"Declaration can have final modifier".
事实上,所有这些变量只设置了一次并且它在构造函数中完成,并且从今天开始,如果我将它们声明为没有问题就没有问题final.
我想知道如果通过这样做,如果代码运行更有效,将会有任何性能改进.换句话说,为什么IDE会向我建议这种变化?
其次,final尽可能声明变量是一种好习惯吗?是否有可以宣布这样的情况,但我最好不要?
我问同事他为什么在这种方法中使用final关键字进行分配,他的回答是"为什么不呢?".我没有看到将决赛放在这里的好处.或者经常,我也会在课堂定义中看到它.
protected void sendIndexWorkflowRequest(Status status)
{
final long contextId = status.getAppContextId();
PrepareIndexPostData preparePostData = new PrepareIndexPostData.Builder(contextId).build();
searchIndexService.activateAggsIndex(preparePostData);
}
Run Code Online (Sandbox Code Playgroud)