Java中对基本类型的引用(如何强制原始数据保持盒装)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中对基本类型的引用(如何强制原始数据保持盒装),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2366字,纯文字阅读大概需要4分钟。
内容图文
![Java中对基本类型的引用(如何强制原始数据保持盒装)](/upload/InfoBanner/zyjiaocheng/812/698632d38cb34f0ea1b21a7540ad48fb.jpg)
我想将一个原始类型的引用传递给一个方法,它可能会改变它.
请考虑以下示例:
public class Main {
Integer x = new Integer(42);
Integer y = new Integer(42);
public static void main(String[] args) {
Main main = new Main();
System.out.println("x Before increment: " + main.x);
// based on some logic, call increment either on x or y
increment(main.x);
System.out.println("x after increment: " + main.x);
}
private static void increment(Integer int_ref) {
++int_ref;
}
}
运行示例的输出是:
x Before increment: 42
x after increment: 42
这意味着int_ref是按值传递给函数的,而不是通过引用,尽管我的名字很乐观.
显然有一些方法可以解决这个特定的例子,但我的实际应用程序更复杂,一般来说,人们可以想象一个“指针”或对整数的引用在许多场景中都会有用.
我试图将Object传递给函数(然后转换为int),以及各种其他方法,没有运气.似乎有效的一种解决方法是定义我自己的Integer类版本:
private static class IntegerWrapper {
private int value;
IntegerWrapper(int value) { this.value = value; }
void plusplus() { ++value; }
int getValue() { return value; }
}
这样做,并传递对IntegerWrapper的引用确实按预期工作,但根据我的口味,它似乎非常蹩脚.来自C#,盒装变量只是盒装,我希望我能错过一些东西.
编辑:
我认为我的问题不是Is Java “pass-by-reference” or “pass-by-value”?的重复,因为我的问题不是理论上的,因为我只是寻求解决方案.从哲学上讲,所有语言中的所有方法调用都是按值传递:它们要么传递实际值,要么通过值传递值.
所以,我会重新解释一下我的问题:解决这个问题的常见范例是什么,在java中我无法传递对Integer的引用.上面提到的IntegerWrapper是一个已知的范例吗?库中是否存在类似的类(可能是MutableInt)?也许一个长度为1的数组是一种常见的做法并且具有一些性能优势?我是唯一一个因为他可以存储任何类型对象的引用而烦恼的人,但基本类型?
解决方法:
正如您可能注意到的,整数是不可变的.
私有静态类IntegerWrapper的方法是正确的.使用大小为1的数组也是正确的,但实际上我从未见过在这种情况下使用数组.所以请使用IntegerWrapper.
您可以在Apache org.apache.commons.lang3.mutable.MutableInt中找到完全相同的实现.
在您的示例中,您还可以向静态方法提供Main实例:
public class Main {
private int x = 42;
public static void main(String[] args) {
Main main = new Main();
incrementX(main);
}
private static void incrementX(Main main) {
main.x++;
}
}
最后,从Java8开始,您可以定义一个inc函数并使用它来增加值:
public class Main {
private static final IntFunction<Integer> INC = val -> val + 1;
private int x = 42;
public static void main(String[] args) {
Main main = new Main();
main.x = INC.apply(main.x);
}
}
内容总结
以上是互联网集市为您收集整理的Java中对基本类型的引用(如何强制原始数据保持盒装)全部内容,希望文章能够帮你解决Java中对基本类型的引用(如何强制原始数据保持盒装)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。