Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Class - Fatal编程技术网

Java 什么';通过方法传递的类或局部变量的属性更好吗?

Java 什么';通过方法传递的类或局部变量的属性更好吗?,java,class,Java,Class,如果一个变量通过多个方法传递,但只在最后一个方法中使用;将此变量声明为类的属性是否更好 我觉得这个问题最好用例子来回答,所以: 示例#1 示例2 有没有一种方法应该被使用?为什么? 编辑:这个问题似乎是情境性的,而且是基于观点的。无论采用哪种方法,都有一些好处。如果只在一个方法中使用该变量,则无需将其设置为私有,这会将其暴露给所有其他方法通过选择传递变量而不是将其设为私有变量: 避免将其暴露于其他方法 您的代码更易于阅读,因为您不需要查看变量的更改位置 您可以避免类具有不必要的属性 答案非常宽泛

如果一个变量通过多个方法传递,但只在最后一个方法中使用;将此变量声明为类的属性是否更好

我觉得这个问题最好用例子来回答,所以:

示例#1

示例2

有没有一种方法应该被使用?为什么?


编辑:这个问题似乎是情境性的,而且是基于观点的。无论采用哪种方法,都有一些好处。

如果只在一个方法中使用该变量,则无需将其设置为私有,这会将其暴露给所有其他方法通过选择传递变量而不是将其设为私有变量

  • 避免将其暴露于其他方法
  • 您的代码更易于阅读,因为您不需要查看变量的更改位置
  • 您可以避免类具有不必要的属性

  • 答案非常宽泛,但通常你可以遵循德米特定律:

    • 每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元
    • 每个单位只能和朋友交谈;不要和陌生人说话
    • 只和你的直系朋友交谈


    所以,在这个特殊情况下,使用参数。生成的应用程序将更易于测试和理解。

    这是基于意见的,所以我投票决定关闭它。然而,我的观点是,这实际上取决于类要表示什么样的内容。如果类表示某种直观上具有“圆圈大小”(或其他大小)的真实世界,则将
    circleSize
    保留为字段。但如果“圆圈大小”不是类所表示的真实对象的一部分,则将其从一个方法传递到另一个方法。这取决于您需要的结果,在第一种情况下,它将存储在类的实例中,并可由其中的每个方法访问(private),第二种方式提供了从其他类或使用不同值(包私有)重用这些方法的能力。但我的意见是,首先你需要决定在哪里使用这个value@DawoodibnKareem在这个特殊的例子中,它适用于javaFX中围绕场景反弹的圆;所以这个圆属于这个类,但circleSize不属于这个类,它属于这个圆。这就是为什么我认为它可以/应该在本地创建。正如前面所说,通过将变量传递给方法,它允许重用这些方法;然而,这似乎是一种更混乱的处理方式,可能对代码的可读性没有帮助?如果您已经有了某种圆形字段,请不要复制该值。不要传任何东西。当您需要圆的大小时,请从圆中检索它。@DawoodibnKareem Good point;我这方面的坏榜样。谢谢你的意见。我以前没听说过这个法律。。。或者我忘记了它的存在:)谢谢。它是前面向对象软件:)
    public class eg1 {
        private int circleSize;
    
        void a() {
            circleSize = ...
            b();
        }
    
        void b() {
            ...
            c();
        }
    
        void c() {
            ... circleSize ...
        }
    }
    
    public class eg2 {
        void a() {
            int circleSize = ...
            b(circleSize);
        }
    
        void b(int circleSize) {
            ...
            c(circleSize);
        }
    
        void c(int circleSize) {
            ... circleSize ...
        }
    }