相关疑难解决方法(0)

为什么我要在Java中的方法参数上使用关键字"final"?

我不明白其中final的关键字是真的方便的时候它是在方法的参数使用.

如果我们排除使用匿名类,可读性和意图声明,那么对我来说似乎几乎一文不值.

强制某些数据保持不变并不像看起来那么强大.

  • 如果参数是基元,那么它将没有任何效果,因为参数作为值传递给方法,并且更改它将在范围之外没有任何影响.

  • 如果我们通过引用传递参数,那么引用本身就是一个局部变量,如果从方法中更改引用,那么从方法范围外部不会产生任何影响.

考虑下面的简单测试示例.尽管该方法改变了给定的参考值,但该测试仍然通过,但它没有效果.

public void testNullify() {
    Collection<Integer> c  = new ArrayList<Integer>();      
    nullify(c);
    assertNotNull(c);       
    final Collection<Integer> c1 = c;
    assertTrue(c1.equals(c));
    change(c);
    assertTrue(c1.equals(c));
}

private void change(Collection<Integer> c) {
    c = new ArrayList<Integer>();
}

public void nullify(Collection<?> t) {
    t = null;
}
Run Code Online (Sandbox Code Playgroud)

java final pass-by-reference pass-by-value

367
推荐指数
8
解决办法
14万
查看次数

不应该指定参数'foo' - 有什么危害?

比较这种方法:

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封闭类中没有命名的字段.)

java eclipse warnings compiler-warnings

29
推荐指数
4
解决办法
2万
查看次数

Java为参数分配新值,这被认为是一种不好的做法吗?

我在这里已经阅读了这个问题:为方法参数赋值是否有问题?.但是,我不清楚是否做了类似的事情:

public void myMethod(Object obj) {
    doSomething(obj);
    obj = getNewObj();
}
Run Code Online (Sandbox Code Playgroud)

要么:

public void anotherMethod(Object obj) {
     obj = doSomething(obj):
}
Run Code Online (Sandbox Code Playgroud)

这基本上只是为了避免声明一个新的局部变量,这值得吗?,这被视为一种不好的做法吗?

java parameters variable-assignment

11
推荐指数
2
解决办法
9634
查看次数