我今天发现了一种不寻常的Java方法:
private void addShortenedName(ArrayList<String> voiceSetList, String vsName)
{
if (null == vsName)
vsName = "";
else
vsName = vsName.trim();
String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length()));
//SCR10638 - Prevent export of empty rows.
if (shortenedVoiceSetName.length() > 0)
{
if (!voiceSetList.contains("#" + shortenedVoiceSetName))
voiceSetList.add("#" + shortenedVoiceSetName);
}
}
根据我所读过的有关Java传递变量(不管是否传递复杂对象)的行为的所有资料,该代码完全不起作用。所以…我在这里想念什么吗?是我身上遗失了一些微妙之处,还是这段代码属于thedailywtf?
正如Rytmis所说,Java按值传递引用。这意味着您可以合法地对方法的参数调用变异方法,但不能重新分配它们并期望值传播。
例:
private void goodChangeDog(Dog dog) {
dog.setColor(Color.BLACK); // works as expected!
}
private void badChangeDog(Dog dog) {
dog = new StBernard(); // compiles, but has no effect outside the method
}
编辑: 在这种情况下,这意味着尽管此方法voiceSetList
可能会
更改(它可能添加了新元素),但vsName
对方法的更改将不可见。为避免混淆,我经常标记方法参数final
,以防止在方法内部重新分配(偶然地或不偶然地)它们。这将完全避免编译第二个示例。
问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。
问题内容: 我试图比较两个相同类型的对象(在dosHave方法中),但是我从未返回过“ true”。这是我的代码: “ Osoba”类如下所示: 来自主代码: 无论我要使用什么输入,这部分都永远不会发生。“ kartoteka”是我当然进口的包裹。每个类都在单独的程序包中,但是使用它们没有问题。我已经尝试了一段时间,但没有任何帮助,似乎 从来都不是真的,但我不知道为什么。没有Boolean.TRU
我在测试一些短信发送和接收结果应用程序。它按预期发送短信,并祝酒“短信发送”。但它从不祝酒“短信发送”。它也从来没有达到 这意味着从不需要为结果SMS_DELIVERED...知道为什么吗?... Androidanifest.xml
问题内容: 是否可以通过Java通过引用传递对象 就像在C#中一样 问题答案: 不,这在Java中是不可能的。 在Java中,方法的所有参数均按值传递。注意非原始型的的变量,它们是对对象的引用,也由值来传递:在这种情况下, 参考 是 由值来传递 。请注意,按值传递引用与按引用传递不同。
问题内容: 在C ++中,如果需要修改2个对象,则可以按引用传递。您如何在Java中完成此操作?假设这两个对象是基本类型,例如int。 问题答案: 你不能 Java不支持传递对变量的引用。一切都通过价值传递。 当然,当通过值传递对对象的引用时,它将指向同一对象,但这 不是通过reference调用 。
问题内容: 在下一个代码中,我尝试调用deinit方法以释放对该实例的所有引用,但从未调用过deinit。为什么? 问题答案: 适用于Swift的Xcode 不能像常规应用程序一样工作;它们不只运行一次。创建的对象保留在内存中,可以检查直到更改代码为止,此时将重新评估整个操场。发生这种情况时,所有先前的结果都将被丢弃,并且所有对象都将被释放时,您将看不到任何结果。 您的代码是正确的,但是Playg