Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 传递变量vs访问类字段_Java_Oop - Fatal编程技术网

Java 传递变量vs访问类字段

Java 传递变量vs访问类字段,java,oop,Java,Oop,我有一个关于节目风格的问题。在类中,将变量传递给方法还是访问方法中的字段更好 public class NumberTest{ private int num; public NumberTest (int num){ this.num = num; calculateX(num); calculateY(); } private void calculateX(int num){ System.out.pr

我有一个关于节目风格的问题。在类中,将变量传递给方法还是访问方法中的字段更好

public class NumberTest{
   private int num;

   public NumberTest (int num){
      this.num = num;      
      calculateX(num);
      calculateY();
   }

   private void calculateX(int num){
      System.out.println (num);
   }

   private void calculateY(){
      System.out.println(num)
   }           
}

在调用成员函数时,您已经在传递对象(如
this
)。除非您需要能够将同一个函数与
this.num
以外的值一起使用,否则也不能从显式指定参数中获得任何好处


简短版本:使用后一种方法,除非您需要
calculateX(一些整数值)

这些方法可能看起来有点像您,因为它们给出相同的结果,但实际上它们彼此非常不同

例如,假设您的
NumberText
方法如下

public NumberTest (int num){
   this.num = num;


   calculateX(num * 2);
   calculateY();
}
calculateX
实际上不会占用字段,但它可以占用完全不同的内容

一般的经验法则是

如果将
num
以外的内容传递到
calculateX
是有意义的,那么您可能应该传递它。否则,不要

还有,如果你这样做

private void calculateX(int num){
   System.out.println (num);
}

将参数名称更改为非
num

num是否为NumberTest的某个状态?你以后需要吗?如果是这样,请将其设置为字段


NumberTest是否只为许多NUM提供函数calculateX?如果是这样,请将calculateX设置为静态。

我将与这里的其他人有所不同

在合理的情况下,我喜欢把这一论点放在一边。这稍微将方法与类实现分离,并使单元测试更容易。例如,由于其他限制,有时将
this.num
设置为94404是一个相当复杂的过程

e、 g.这是一个邮政编码,但您的业务逻辑要求它必须与州和国家字段匹配。或者,在实践中,该字段是从数据库、网站等读取的

如果您传递了参数,那么您的单元测试可以通过快捷方式传递值。而且,在不太可能的情况下,您可能会遇到一种特殊情况,您不想使用类字段中的内容,您可以这样做

现在,如果您使用的是27个类字段,那么您显然不想传入27个参数。但是,依我看,如果是1或2,我喜欢把它们传进去

验收后增加的次要注意事项:


传入arg和使用字段之间还有另一个可能的区别。在多线程环境中,使用传入参数可能比从字段读取更安全。字段可能在函数的中间被更改,而传入的参数取决于类型和用法,不太可能发生变化。在本例中,传入的
int num
永远不会意外更改,但
this.num
可能会更改。

这两种方式都不太可能产生差异。不同意,单元测试方面存在差异-请参阅我的答案。