Java 当实例变量';它将通过多种方法传递?
如果要通过对象的多个方法传递参数,那么将该参数保存到实例变量是否明智 例如:Java 当实例变量';它将通过多种方法传递?,java,oop,Java,Oop,如果要通过对象的多个方法传递参数,那么将该参数保存到实例变量是否明智 例如: public class Example { private int[] array; public void doThingsToArray(int[] array) { this.array = array; // `array` doesn't need to be passed as an argument. doFirstThingToArra
public class Example {
private int[] array;
public void doThingsToArray(int[] array) {
this.array = array;
// `array` doesn't need to be passed as an argument.
doFirstThingToArray();
doSecondThingToArray();
...
}
...
}
在这种情况下,Example
的同一个实例将用于在多个数组上调用doThingsToArray()
,因此不能将array
作为参数传递给Example
的构造函数
我所看到的优点是,您不必将array
作为参数传递,而且至少根据干净的代码,方法的参数越少越好
我想不出一个可靠的骗局,但我感觉到这种情况有问题
如果要通过对象的多个方法传递参数,那么将该参数保存到实例变量是否明智
不,那样做是不明智的
从设计角度来看,您建议保存在实例变量中的值不是对象的属性;相反,它是给定计算的属性。因此,方法参数和/或局部变量是它所属的位置,它绝对不属于实例变量
从实用的角度来看,依赖实例变量中隐藏的值会破坏线程安全。不能在同一个对象上同时运行多个计算,因为每个计算都希望能够使用相同的实例变量来实现自己的目的。Solid con:这会立即使您的类成为非线程安全的。字段并不是对象状态的一部分,而是某些方法使用的临时值。”……至少根据干净的代码,一个方法的参数越少越好。”这并不意味着“无参数”是“好的”。这只是意味着:如果得到太多的参数,请将它们打包到一些
ConfigurationObject
中,并让该方法的参数为ConfigurationObject
。另一个缺点是,无法立即明确哪些方法需要按哪个顺序调用。IIRC Clean Code讨论了这一场景,并建议使用参数和返回值来清晰地勾勒调用链。或者委托给某些状态实际上是数组的ArrayComputer对象。另一个避免使用实例变量而使用参数的原因是易于测试。如果每个子方法获取并返回一个数组,它们都可以独立测试。因此实例变量应该只描述对象的状态?@Pig,是的。这实际上是“面向对象”的定义。它还模糊了逻辑,使得代码非常脆弱。例如,该字段何时具有有效值?如果在将来的一些修改中,在分配字段之前尝试使用该字段,则会得到一个null
值。如果您尝试在方法调用之外使用它,您可能会看到上一次调用中的过时值,不管是什么调用。因此,即使是在单线程应用程序中,它也是非常有问题的。