Java:返回两个" immutable"的最好方法整数?

时间:2014-03-27 06:51:23

标签: java arrays return-value immutability

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点提供了有价值的线索。由于我不能选择多个答案是正确的,我选择了对我最有用的答案,但我感谢大家的帮助。

5 个答案:

答案 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类:

http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/tuple/Pair.html

与不可变的一起。

或创建自己的自定义:

Using Pairs or 2-tuples in Java

答案 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 []时,它是否真正理解为   整数[],我的意思是数组只能保存引用,而不是原语?

这是两件不同的事情,

  1. int []是标准的基元数组,
  2. Integer []是一个对象数组 - 表示指向整数对象的指针数组。
  3.   

    当从函数返回两个不可变整数时,是   这两种方式相当吗?

    1. int总是可变的
    2. 整数是不可变的
    3. 所以在这种情况下,如果你想使用不可变对象,你需要使用Integer,但是你可以随时更改数组中的指针,这样你就会失去一致性。

        

      返回两个不可变整数的标准做法是什么?

      我会看看apache常见的ImmutablePair()