将属性用作局部变量是一种好习惯。在有许多使用某些变量的方法的情况下,在每个方法中变量值都会发生变化。这避免了多次创建新变量并且代码增加。有什么建议吗?
private void method1(){
int totalLength = length1 + 10;
int totalBreath = (breath1 + breath2) + 20;
int size = (totalLength * totalLength);
System.out.println(size);
}
private void method2(){
int totalLength = length1 + 20;
int totalBreath = (breath1 + breath2) + 30;
int size = (totalLength * totalLength);
System.out.println(size);
}
private void method3(){
int totalLength = length1 + 60;
int totalBreath = (breath1 + breath2) + 10;
int size = (totalLength * totalLength);
System.out.println(size);
}
如您所见,在每种方法中都会重复totalLength,totalBreath,size。我可以把它们作为班级的领域吗?所以,我不需要在每种方法中声明它。
private void method1(){
totalLength = length1 + 10;
totalBreath = (breath1 + breath2) + 20;
size = (totalLength * totalLength);
System.out.println(size);
}
答案 0 :(得分:2)
我把你的问题读作“,什么时候应该将一个局部变量提升为该类的一个字段?”
最好的答案是“它取决于”,但话又说回来,它的准确性很快就因缺乏实用性而黯然失色。
字段应该与类本身有关系,因为字段是类的属性?我在下面举了一个例子来说明语法差异,但我同意this post如果它污染了类的含义就应该避免它。
通常,当需要在为类的给定实例调用不同方法之间维护字段的值时,您只需要有一个字段,并且可以选择在方法之间保持值时使其保持静态调用该类的所有实例。这将取决于几个因素,如商店会议,性能目标,现有代码库等,因此没有特定代码就没有单一的正确答案。 This question似乎包括类似的观点。如果您发现自己使用下面的方法,您可能会考虑其他方法,例如将行为重构为帮助类。
Another question从编程学生的角度提出同样的问题。
public class VariableScope {
int field1 = 3;
void foo() {
int a = 2;
// variable passing in width
bar1(1);
bar2(1);
// variable passing in depth
bar3(a);
// uses a field to reduce variable passing
baz1();
baz2();
}
void bar1(int param) {
System.out.println("param=" + param);
}
void bar2(int param) {
System.out.println("param=" + param);
}
void bar3(int param)
{
System.out.println("Passing param to bar4");
bar4(param);
}
void bar4(int param){
System.out.println("param=" + param);
}
void baz1() {
System.out.print("field1=" + field1);
}
void baz2() {
System.out.print("field1=" + field1);
}
}
答案 1 :(得分:1)
听起来,如果你将变量用于多种方法,你应该将变量声明为全局变量。但是,是的,如果没有其他方法需要该变量,并且您不想编写一堆返回语句,则可以使用局部变量
答案 2 :(得分:1)
我想你的意思是属性字段,通常有访问器和mutator(get,set-methods)。
通常,您应该尽可能地保持变量的范围。例如,如果您使用多个for循环,例如:
for ( int i = 0 ; i < 10 ; i++ ) {
}
并将其替换为
int i;
method1() {
for ( i = 0 ; i < 10 ; i++ ) {
// some code;
}
}
method2() {
for ( i = 0 ; i < 10 ; i++ ) {
// some code;
}
}
如果一个线程调用method1()而另一个调用method2(),则会遇到一个竞争条件。 您可以轻松地在代码中引入难以找到的错误。
答案 3 :(得分:1)
我认为你的意思是这样的:
Class foo() {
int x;
public bar() {
for(x = 0; x <100; ++x) ...
} }
不,这不是好习惯。
一个甚至可能有害的地方是同步/并发/多线程案例:如果你正在与类成员合作,他们将需要同步,这会影响性能。否则,您可能会冒多个线程覆盖字段值的风险,这可能会导致程序出错(可能很难调试)。