Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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/kotlin/3.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_Android_Software Design - Fatal编程技术网

Java 使用局部变量还是全局变量更好

Java 使用局部变量还是全局变量更好,java,android,software-design,Java,Android,Software Design,使用局部变量还是全局变量更好 让我们来谈谈2000多行android(java)服务类,所有服务都在处理“请求”对象和类似的共享对象 若我使所有内容都是局部的(保持在函数内部),那个么每次都需要传递许多变量,或者多次重写同一个函数。我需要确保对象和子对象也不为null 如果我使一些变量成为全局变量(在类中),我可以共享它们,在函数中使用它们。我想这会让一切变得更容易 在函数内部定义变量或全局定义变量有哪些好的方面和坏的方面。在实践和理论上(可读性等) 有什么建议吗 谢谢。总是喜欢本地而不是全球。

使用局部变量还是全局变量更好

让我们来谈谈2000多行android(java)服务类,所有服务都在处理“请求”对象和类似的共享对象

若我使所有内容都是局部的(保持在函数内部),那个么每次都需要传递许多变量,或者多次重写同一个函数。我需要确保对象和子对象也不为null


如果我使一些变量成为全局变量(在类中),我可以共享它们,在函数中使用它们。我想这会让一切变得更容易

在函数内部定义变量或全局定义变量有哪些好的方面和坏的方面。在实践和理论上(可读性等)

有什么建议吗


谢谢。

总是喜欢本地而不是全球。如果需要将数据作为多个参数传递进来,那就这样吧。至少你明确地说出了你的函数所依赖的数据。拥有太多的参数当然是个问题,但将其中一些参数作为全局参数卸载并不是答案

如果您依赖globals,则某些数据的来源可能不太清楚。如果全局变量是可变的,那么一旦您开始调试一个难题,您的手就会变得一团糟,因为在修改某些全局变量时,它可能并不明显


但请注意,不可变常量全局变量并不坏。如果你有一个在很多函数中都需要的常数(比如PI),那么把它设为全局变量是有意义的。不可变常量没有上述缺点,因为它们无法更改。

这一切都取决于变量的范围。如果您觉得某个变量将通过传递不同的函数来获取多个值,那么请使用局部变量并在函数调用中传递它们。
如果您觉得需要使用的某个变量将具有常量值,则将其声明为全局变量。

您编写了2000多行服务类。你完成了这个项目。酷!现在,一个月后,您报告了一个bug,需要修复它


让我们看两种不同的情况:

案例1 你回到了服务代码上。您可以看到
func1()
使用
globalVariabl1
。好吧,但现在它的价值是什么?它是如何变化的?在使用此函数之前,是谁对
globalVariabl1
进行了变异?所有这些突变的顺序是什么?你不会知道的。这一切都很难弄清楚

案例2 回到您的代码中,您可以看到
func0()
获取一些内容,然后将其作为参数传递给
func1(param1)
。你清楚地知道数据是什么,它是如何到达这里的


在什么情况下,解决错误会更容易? 大多数情况下,案例2会让事情变得更简单

局部变量

局部变量总是对您有帮助的。即使在编写代码并使用局部变量时,call语句本身也会告诉您此函数依赖于此特定数据。这有助于你对所传递的信息保持谨慎

全局变量


当全局变量表示类/对象的
状态
时,或者甚至当它们是常量(通常都应该是大写字母)时,它们都可以。当您只需要频繁地访问该值时,它们也很有用,并且您知道在使用变量时总是会初始化它(例如在onCreate()中初始化它)

Java中没有全局变量。您指的是成员变量。基本规则是变量应该具有尽可能小的封闭范围。

我知道问题已经得到了回答,我对Carcigenicate的答案投了赞成票

为了详细阐述他的观点,我建议您尝试测试驱动的开发实践。一旦您开始结合单元测试来编写代码,您就会意识到全局变量有多糟糕,并且您会意识到您正在编写的代码不需要实现不必要的依赖注入就无法进行测试


还有一件事。每当您开始处理多线程和并发时,全局变量都是一个巨大的错误。听起来你并不是在处理这个问题,但在你决定创建一个全局变量时,请记住这一点。

这是一个简单的问题。全球化几乎总是一个错误,会以意想不到的方式咬你。同样,Java也会将值传递给函数。“如果我将某些变量设置为全局变量(跨类)”——类中的普通字段并不像大多数程序员使用的那样是“全局”的。如果你能提供一个确切的例子来说明“使某些变量成为全局变量”的含义,你可能会有更好的运气。根据这一思路,场是邪恶的,应该避免吗?@efekctive特别是,可变场是邪恶的。易变性增加的复杂性比不必要地使用时节省的复杂性要多。@MmtBkn如果您有一个参数那么多的函数,您需要重构该函数,也许还需要定义一些新对象。删除参数只会让事情变得更糟。