有效的java强调本地化变量的范围。但是如果我们有一个if else,它可能导致多个declation,例如:
public List<E> midPoint() {
if (first == null) {
throw new NullPointerException("Linked list is empty");
}
if (first.next == null) {
ArrayList<E> arr = new ArrayList<E>();
arr.add(first.element);
return arr;
}
Node<E> fast = first.next;
Node<E> slow = first;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// even count for number of nodes in linkedlist.
if (fast != null) {
ArrayList<E> arr = new ArrayList<E>();
arr.add(slow.element);
arr.add(slow.next.element);
return arr;
} else {
ArrayList<E> arr = new ArrayList<E>();
arr.add(slow.element);
return arr;
}
}
在上面的代码中,Arraylist defination /声明多次出现,但是变量是本地化的。它的方式是好的OR应该在顶部声明arrayList并返回匹配条件的地方:例如:
public List<E> midPoint() {
if (first == null) {
throw new NullPointerException("Linked list is empty");
}
ArrayList<E> arr = new ArrayList<E>(); // NOTE - JUST A SINGLE DECLARATION.
if (first.next == null) {
arr.add(first.element);
return arr;
}
Node<E> fast = first.next;
Node<E> slow = first;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// even count for number of nodes in linkedlist.
if (fast != null) {
arr.add(slow.element);
arr.add(slow.next.element);
return arr;
} else {
arr.add(slow.element);
return arr;
}
}
由于
答案 0 :(得分:2)
在这种情况下,建议您仅在一个地方声明它。它将更具可读性,并且可以节省一些代码。
重命名也很好,可能表明这是您方法的最终结果(如returnArray
,resultArray
)。
在其他情况下,当该列表意味着几个不同的事情时,最好是声明它,在这种情况下,你也会有不同的名字。
答案 1 :(得分:1)
我们是否应该以多个声明的代价本地化范围变量
不同的人(包括备受好评的着名教科书作者)对于什么使代码可读具有不同的意见。问题在于可读性是一种主观的衡量标准:它取决于读者。
所以我认为由你来决定。您可能会成为代码的主要读者,至少从一开始就是这样。所以...
使用 认为使代码更具可读性的版本。
如果您想要第二意见,请询问您的同事。
如果您选择使用样式指南...请遵循它所说的内容。
FWIW,我个人认为,这实际上取决于具体情况。有时最好是本地化,有时不是。很大程度上取决于声明与使用的“距离”有多远,以及变量的含义是多么直观。 (例如,如果arr
被命名为res
或result
,则您不需要查看变量声明...假设您知道当前方法的签名。)
答案 2 :(得分:0)
多次声明它并没有错,但是你有很多重复的代码:你可以通过重构来显着改进你的代码。
在您的情况下,JDK提供了一种方便的实用工具方法来在线创建ArrayLists:
而不是:
ArrayList<E> arr = new ArrayList<E>();
arr.add(slow.element);
arr.add(slow.next.element);
return arr;
编码:
return Arrays.asList(slow.element, slow.next.element);
等等。
请注意,从asList()
返回的列表不可修改。如果您需要可修改的列表,请将其传递给ArrayList
's copy constructor:
return new ArrayList(Arrays.<E>asList(slow.element, slow.next.element));