我不明白其中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) 我目前正在通过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?
问题:考虑以下浮点数[]:
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 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编程,最近我开始学习一些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"不同的名称