Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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 当实例变量';它将通过多种方法传递?_Java_Oop - Fatal编程技术网

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
值。如果您尝试在方法调用之外使用它,您可能会看到上一次调用中的过时值,不管是什么调用。因此,即使是在单线程应用程序中,它也是非常有问题的。