Java 私有方法中的类变量
将类变量作为参数传递给私有方法与简单地引用它们相比,有什么优点/缺点吗?随着我的类越来越长,我担心未来的程序员需要向上滚动到类的顶部,以了解“foo”是什么,所以我考虑在调用方法时将它们作为参数传递,但我不确定这是否会导致我没有考虑的其他问题 简言之;这是:Java 私有方法中的类变量,java,Java,将类变量作为参数传递给私有方法与简单地引用它们相比,有什么优点/缺点吗?随着我的类越来越长,我担心未来的程序员需要向上滚动到类的顶部,以了解“foo”是什么,所以我考虑在调用方法时将它们作为参数传递,但我不确定这是否会导致我没有考虑的其他问题 简言之;这是: public class Foo { private int number = 0; public Foo(int startingNumber) { this.number = startingNumb
public class Foo {
private int number = 0;
public Foo(int startingNumber) {
this.number = startingNumber;
}
public int biggerNumber() {
return embiggenIt(number);
}
// ... Many lines of code ...
private int embiggenIt(int aNumber) {
return aNumber++;
}
}
比这更好或更糟的是:
public class Foo {
private int number = 0;
public Foo(int startingNumber) {
this.number = startingNumber;
}
public int biggerNumber() {
return embiggenIt();
}
// ... Many lines of code ...
private int embiggenIt() {
return this.number++;
}
}
。。。如果是,为什么
编辑
好的,显然我应该在这里说明,我不关心更改类变量,我不确定为什么每个人都会得出这样的结论;我没有意识到我的例子有那么糟糕(尽管我很快就把它拼凑起来了)。在这个示例中,我所关心的是运行该方法后的返回值(想想函数式编程)
也许这是我所说的一个更好的例子:
public class Foo {
private static final int number = 0;
public Foo() {
}
public int biggerNumber() {
return embiggenIt(number);
}
// ... Many lines of code ...
private int embiggenIt(int aNumber) {
return aNumber +1;
}
}
v、 美国
我要强调的是,变量不必是常数,但我补充说,只是为了说明我对修改变量不感兴趣(我理解通过引用传递还是通过值传递,谢谢)
现在我们有点清楚了,这两种方法有区别吗?你喜欢读哪一本?这会让你打小程序员的指关节吗?在第一种情况下,你是在传递值。因此,永远不会修改类的成员变量。在第二种情况下,您引用的是类变量本身 我认为情况更糟,因为跟踪示波器只会让你头疼。例如,在您的第一个代码中,类变量
number
的值不会增加,因为您只增加了本地字段aNumber
的值,该字段指向的变量与aNumber
不同。首先,您的所有代码示例将产生不同的结果-第一个示例不起任何作用,而第二个实际上是递增的number
。但是,两者都返回变量的旧值(即没有添加1),因为您使用后减量运算符x++
(而不是++x
)
其次,如果使用自解释名称,即使在大型类文件中使用字段也没有问题
第三,如果您想给字段赋值,通常不可能省略使用该字段。在java中,本机类型如int、double、,。。。是通过值传递的 任何类对象都是通过引用传递的
所以在代码中可以使用Integer类而不是int,所以我终于找到了问题的答案。似乎其他人阅读我的代码时没有理解这个问题,但我自己却意外地找到了正确的答案
将变量传递给方法比简单地引用类变量更可取,因为它允许我们在测试时执行依赖项注入。明显的例外是类常量。您知道这两个代码有不同的行为吗?请注意,原语类型将作为值传递,而不是通过引用传递的
对象。您的第一个示例不会增加类成员。@XaviLópez甚至对象引用都是按值传递的。@RohitJain确实如此。我被纠正了:-)我确实理解每个方法如何影响类变量之间的差异,我这样做是为了从函数中获得返回值。对不起,这个坏例子。
public class Foo {
private static final int number = 0;
public Foo() {
}
public int biggerNumber() {
return embiggenIt();
}
// ... Many lines of code ...
private int embiggenIt() {
return this.number +1;
}
}