0

有效的java非常强调变量的本地化范围。但是如果我们有一个 if else 它可能会导致多次贬值,例如:

   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 定义/声明多次出现,但变量是本地化的。它是好的方式还是应该在顶部声明 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;
    }
}

谢谢

4

3 回答 3

2

在这种情况下,建议您只在一处申报。它将更具可读性并节省一些代码行。

重命名也很好,也许这表明这是您的方法的最终结果(如returnArray, resultArray)。

在其他情况下,当该列表意味着几个不同的事物时,最好声明它,在这种情况下,您也会有不同的名称。

于 2013-06-15T23:50:20.450 回答
1

我们是否应该以多次声明为代价来本地化范围变量

不同的人(包括著名教科书的受人尊敬的作者)对于什么使代码具有可读性会有不同的看法。问题在于可读性是一个主观的衡量标准:它取决于读者。

所以我认为由你决定。您很有可能会成为您的代码的主要读者,至少在开始时是这样。所以 ...

  • 使用认为使代码更具可读性的版本。

  • 如果您需要第二意见,请询问您的同事。

  • 如果您选择使用风格指南……请遵循它所说的内容。


FWIW,我个人的看法是,这真的取决于上下文。有时最好进行本地化,有时则不然。很大程度上取决于声明离用法有多“远”,以及变量的含义有多直观。(例如,如果arr被命名为resor result,则无需查看变量声明……假设您知道当前方法的签名。)

于 2013-06-15T23:50:40.420 回答
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的复制构造函数

return new ArrayList(Arrays.<E>asList(slow.element, slow.next.element));
于 2013-06-16T00:08:45.320 回答