在Java中,有一种做法是声明每个变量(本地或类),如果确实是参数final.
虽然这使得代码更加冗长,但这有助于轻松阅读/掌握代码,并且还可以防止错误,因为意图已明确标记.
您对此有何看法,您对此有何看法?
我发现了一些建议使用的参考文献(例如)final尽可能多地使用,我想知道它有多重要.这主要是在方法参数和局部变量的上下文中,而不是最终方法或类.对于常数,它显然是有道理的.
一方面,编译器可以进行一些优化,这使得程序员的意图更加清晰.另一方面,它增加了详细程度,优化可能是微不足道的.
这是我应该努力记住的事情吗?
是否有任何性能原因在Java中声明方法参数final?
如:
public void foo(int bar) { ... }
Run Code Online (Sandbox Code Playgroud)
与:
public void foo(final int bar) { ... }
Run Code Online (Sandbox Code Playgroud)
假设bar只读取并且从未修改过foo().
我想知道是否有使用最终局部变量的可用性.当继承进入图像时,无论如何都不会覆盖变量.例如,如下的简单代码
public static void main(String args[]) {
final String data = "Hello World!";
System.out.println(data);
}
Run Code Online (Sandbox Code Playgroud)
这个例子非常简单,可能不是相关的代码,但问题更通用.我看过很多代码(都包含在main函数中,它们都有最终的局部变量)是否有任何可用性来声明局部变量作为最终的其他而不是他们不能在同一个功能本身编辑?
我来自C++背景,目前我正在学习Java.当我尝试使用某些第三方库时出现了一个问题.如何确定对作为参数的对象引用的方法的调用是否修改了对象?在C++中,由于使用了const关键字,因此很清楚.如果方法签名是:
void foo(Boo& boo);
Run Code Online (Sandbox Code Playgroud)
我知道引用的对象可能会被修改,而如果方法签名是:
void foo(const Boo& boo);
Run Code Online (Sandbox Code Playgroud)
编译器保证不会修改引用的对象.
我没有在Java中看到类似的东西,因为只有引用本身可以被声明为final,而不是引用的对象,并且最终的参数在第一个地方没有多大意义,因为它无论如何都是通过值传递的.因此,当我看到一个方法,如:
void foo(Boo boo) {...}
Run Code Online (Sandbox Code Playgroud)
如何确定boo引用的对象是否在函数体内修改(可能使用注释)?如果没有办法知道,是否有一些广泛使用的约定或一些最佳实践来避免混淆和错误?
我正在检查一些Java代码,我不擅长java至少有一些知识,如密封类,只读字段和不可覆盖的方法,但这对我来说很奇怪,final在方法中声明一个变量:
private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception {
// Set up Books client.
final Books books = Books.builder(new NetHttpTransport(), jsonFactory)
.setApplicationName("Google-BooksSample/1.0")
.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
@Override
public void initialize(JsonHttpRequest request) {
BooksRequest booksRequest = (BooksRequest) request;
booksRequest.setKey(ClientCredentials.KEY);
}
})
.build();
Run Code Online (Sandbox Code Playgroud)
你能告诉我final在这种情况下的含义是什么吗?
这是完整的代码:
比较这种方法:
void doStuff(String val) {
if (val == null) {
val = DEFAULT_VALUE;
}
// lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)
...对于这种方法:
void doStuff(String origVal) {
String val = origVal;
if (val == null) {
val = DEFAULT_VALUE;
}
// lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)
对于前一种方法,Eclipse会发出警告"不应分配参数'val'".为什么?
在我看来,前者更清洁.首先,它并没有迫使我想出两个好名字val(想出一个好的名字就足够了).
(注意:假设val封闭类中没有命名的字段.)
我理解以下声明是如何工作的.
for(final Animal animal : animalList){
//do some function
}
Run Code Online (Sandbox Code Playgroud)
但是在这里使用final关键字的目的是什么?
什么是Java更快.直接多次访问数组索引,或将数组索引的值保存到新变量并使用它来进行后续计算?
访问索引
if ((shape.vertices[0].x >= fromX && shape.vertices[0].x <= toX) || // left side of shape in screen
(shape.vertices[0].x <= fromX && shape.vertices[0].x + shape.width >= fromX) || // right side of shape in screen
(shape.vertices[0].x >= fromX && shape.vertices[0].x + shape.width <= toX)) { // shape fully in screen
// ...
}
Run Code Online (Sandbox Code Playgroud)
临时变量
float x = shape.vertices[0].x;
float y = shape.vertices[0].y;
if ((x >= fromX && x <= toX) || // left side of shape in screen
(x <= …Run Code Online (Sandbox Code Playgroud)