1)当Java遇到int[]
时,它是否真的将其理解为Integer[]
,我的意思是数组只能保存引用,而不是原语吗?
2)当从函数返回两个不可变整数时,这两种方式是等价的吗?
int a, b;
...
int[] returnVal = {a, b};
return(returnVal);
VS
Integer a, b;
...
Integer[] returnVal = {a, b};
return(returnVal);
3)返回两个不可变整数的标准做法是什么?
编辑:
我想知道“immutable”是否实际上是正确使用的术语,因为我的问题是如何安全地将一对整数值返回给调用者,同时阻止调用者更改原始值而不使用不必要的克隆()。
通过尝试不同的代码片段,对#2点的简短回答似乎是您可以安全地将值返回为int []或Integer []。调用者可以更改返回数组的元素,但不能更改初始值。
下面的答案为此提供了解释,并为第1点和第3点提供了有价值的线索。由于我不能选择多个答案是正确的,我选择了对我最有用的答案,但我感谢大家的帮助。
答案 0 :(得分:1)
标准做法是:
public class NameThatDescribesWhatAPairOfIntegersSymbolicallyRepresents {
private final int nameDescribingFirstInteger'sRole;
private final int nameDescribingSecondInteger'sRole;
public NameThatDescribesWhatAPairOfIntegersSymbolicallyRepresents(
int firstInteger, int secondInteger) {
nameDescribingFirstInteger'sRole = firstInteger;
nameDescribingSecondInteger'sRole = secondInteger;
}
public int getDescriptiveNameOfFirstInteger() {
return nameDescribingFirstInteger'sRole;
}
public int getDescriptiveNameOfSecondInteger() {
return nameDescribingSecondInteger'sRole;
}
}
两年后,任何不足都会导致一个贫穷,心怀不满的编码员,盯着看:
status = result[0] + 2 * result[1];
当他对自己说话的时候继续撕掉他的头发“这是什么!@#$是int []结果”?
===编辑===
除此之外,你的问题的答案是:
1)不,这些是完全不同的东西。基元和对象具有不同的句柄,消耗不同的内存量,并以不同的方式运行。
2)见(1) - 不。
此外,没有数组 - 无论是int [],还是Integer [] - 都可以是不可变的。 Java数组被定义为总是可变的,您无法阻止调用者更改数组中的元素。使方法返回“不可变”数组的唯一方法是,每次调用它时都会生成一个全新的副本,并且永远不会发出内部的可变数据。
3)见上文
答案 1 :(得分:1)
不,他们不相同。编译器使用一种称为自动装箱的技巧来使a和b在int和整数之间切换。它会根据需要自动应用Integer.valueOf(primitiveInt)
或integerInstance.intvalue()
。
最好的语义是是否可以缺少任何数字。这仅适用于Integer
,而不适用于int
apache commons中有一个合适的Pair
类:
与不可变的一起。
或创建自己的自定义:
答案 2 :(得分:1)
当Java遇到int []时,它是否真的理解为 整数[],我的意思是数组只能保存引用,而不是原语?
否则返回int[]
整数值集合(原始类型)数组与Integer[]
整数对象集合(对象)不同
第二个问题。
两者都不相同,因为它完全取决于方法的返回类型。
由于您无法返回int[]
,其方法的返回类型为Integer[]
。
对于不可变返回,我想添加你没有修改对象,而是将引用指向另一个对象,这只发生在Integer
而不是int
中。
从某种意义上说,它取决于你的代码,但是如果你问哪一个更好,我会说在实践中将int包装到Integer会更好。
答案 3 :(得分:1)
如果要返回包装类对象,我们会遇到这些情况。 一个简单的解决方案是返回地图,如下所示:
private void parentFunction() {
Map<String,Integer> flagsForEventRule = new HashMap<>();
// call the method inside which you want to set these parameters
sample(flagsForEventRule);
System.out.println(flagsForEventRule.get("pathsMatched"));
}
private void sample(Map<String,Boolean> flagsForEventRule) {
// you can set the values in map like this
flagsForEventRule.put("pathsMatched", 1);
flagsForEventRule.put("shouldCreateRule", 2);
}
答案 4 :(得分:0)
1)当Java遇到int []时,它是否真正理解为 整数[],我的意思是数组只能保存引用,而不是原语?
这是两件不同的事情,
当从函数返回两个不可变整数时,是 这两种方式相当吗?
所以在这种情况下,如果你想使用不可变对象,你需要使用Integer,但是你可以随时更改数组中的指针,这样你就会失去一致性。
返回两个不可变整数的标准做法是什么?
我会看看apache常见的ImmutablePair()