相关疑难解决方法(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万
查看次数

为什么声明一个函数参数是最终的?

我目前正在通过Sams出版的"24小时自学Android应用程序开发"一书.我对Java,Android或其他方面比较陌生.我在ActionScript 3中有一个非常扎实的背景,它与Java有足够的相似之处,语言本身并不难理解,但我仍然对本书中某些代码示例背后的基本原理有一些疑问.例如,这是第9小时的示例代码附带的函数:

private void processScores(final TableLayout scoreTable, 
      XmlResourceParser scores) throws IOException, XmlPullParserException{
Run Code Online (Sandbox Code Playgroud)

在此函数签名中,作者已将scoreTable参数声明为final.我有点不解为什么他们这样做了.即使尝试为函数参数scoreTable分配一个新值,也不会让我想到这一点(在ActionScript中它被认为是一种不好的做法).此外,我还没有看到任何人在我检查或移植到AS3中的任何真实Java中都这样做.

有没有关于Android开发的具体内容,有时需要将某些函数参数声明为final?

为什么TableLayout对象声明为final,而不是XmlResourceParser?

java android final

56
推荐指数
1
解决办法
3万
查看次数

Java数组排序:快速获取数组索引的排序列表

问题:考虑以下浮点数[]:

d[i] =     1.7 -0.3  2.1  0.5
Run Code Online (Sandbox Code Playgroud)

我想要的是一个int []数组,它表示带索引的原始数组的顺序.

s[i] =       1    3    0    2
d[s[i]] = -0.3  0.5  1.7  2.1
Run Code Online (Sandbox Code Playgroud)

当然,可以使用自定义比较器,自定义对象的排序集,或者通过简单地对数组进行排序,然后搜索原始数组中的索引(颤抖)来完成.

我实际上正在寻找的是Matlab的sort函数的第二个返回参数的等价物.

有没有一种简单的方法(<5 LOC)?可能有一个解决方案,不需要为每个元素分配一个新对象?


更新:

谢谢你的回复.不幸的是,迄今为止提出的所有内容都不像我希望的简单而有效的解决方案.因此,我在JDK反馈论坛中打开了一个帖子,建议添加一个新的类库函数来解决这个问题.让我们看看Sun/Oracle对此问题的看法.

http://forums.java.net/jive/thread.jspa?threadID=62657&tstart=0

java arrays sorting class-library

38
推荐指数
5
解决办法
4万
查看次数

Java停止了内部类中非final变量的错误(java 8)

Java 7在下面的代码中说"不能引用封闭范围中定义的非最终局部变量消息":

public class Runner {   
    public static void main(String[] args) {

        String message = "Hello world";

        new Runnable() {
            @Override
            public void run() {
                System.out.println(message);
            }
        }.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

Java 8没有.

怀疑这是关于向Java添加函数编程功能.

它是否同样处理代码?

java inner-classes java-8

25
推荐指数
2
解决办法
5274
查看次数

Setter在Java中完成了最后的决赛

我一直在用java编程,最近我开始学习一些c ++.

在C++中,将setter params设置为const是常规的,为什么我们在java中看不到这一点?

我的意思是创建一个像这样的setter有任何缺点:

public void setObject(final Object o){ this.o=o; }
Run Code Online (Sandbox Code Playgroud)

VS

public void setObject(Object o){ this.o=o; }
Run Code Online (Sandbox Code Playgroud)

第一个应该强制Object param o在整个set函数中保持不变,不是吗?

编辑:

最后一个参数将强制执行此操作:

public void setName(String name){ 
     name="Carlos";
     this.name=name; 
}
Run Code Online (Sandbox Code Playgroud)

用户将永远无法设置与"Carlos"不同的名称

java setter final const

7
推荐指数
2
解决办法
3485
查看次数