gpt4 book ai didi

java - 在 Java 中修改对象引用值的最佳实践?

转载 作者:行者123 更新时间:2023-11-30 07:25:01 26 4
gpt4 key购买 nike

我是 Java 的新手,最近我在阅读一些有关 Java 是按值传递的 Material 。我读过 this question , 和 this blog在我自己运行测试之前。

现在,根据我的阅读和快速测试,我发现有两种方法可以更改对象引用中包含的变量。以下哪种方法更好或更安全?这两种方法都存在明显的问题吗?

这两个都打印出“iArr[0] = 45”。

方法一:

public static void main(String args[] ){
int[] iArr = {1};
method(iArr) ;
System.out.println( "iArr[0] = " + iArr [0] ) ;
}
public static void method(int[] n ) {
n [0] = 45 ;
}

方法 2:

public static void main(String args[] )
{
int[] iArr = {1};
iArr = method(iArr) ;
System.out.println( "iArr[0] = " + iArr [0] ) ;
}
public static int[] method(int[] n ) {
n [0] = 45 ;
return n;
}

最佳答案

我发现两种方法都不理想,因为它们都会导致相同的副作用

也就是说,它们是相同的但第二种方法返回修改后的对象:第二种方法仍然 em> 修改传入的数组对象!将示例代码中#2 的返回值重新分配给 iArr 对修改的对象没有影响!请记住,Java 使用 Call-By-Object-Sharing语义(对于引用类型);返回值与此行为无关

我实际上真的不喜欢方法#2,因为它“隐藏”了这个事实(我看着签名并想“哦,我得到了一个数组对象!” ),虽然方法 #1“做的是肮脏的工作”,但我可以从 void 返回类型中快速分辨出来。 (在某些高级外壳中,“链接”可能很有用;这不是其中之一。)

这是一个简单的版本,不会引起副作用:(我建议尽量减少一般的副作用,因为它通常使代码更容易推理和调试。)

public static void main(String args[] )
{
int[] iArr = {1};
int[] newArr = method(iArr) ;
System.out.println( "iArr[0] = " + iArr [0] ) ;
// This is different here, but it would "be the same" in the
// 2nd-case example in the post.
System.out.println( "newArr[0] = " + newArr [0] ) ;
}
public static int[] method(int[] n ) {
// This is a silly stub method, n would be presumably used.
int[] x = new int[1];
x[0] = 45; // modifying a DIFFERENT object
return x; // returning the NEW object
}

关于java - 在 Java 中修改对象引用值的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11148071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com