Java静态方法的优缺点

2024-03-27

我以前没有使用过很多静态方法,但最近我倾向于使用更多静态方法。例如,如果我想在类中设置一个布尔标志,或者访问一个类而不需要通过类传递实际对象。

例如:

public class MainLoop
{
    private static volatile boolean finished = false;

    public void run()
    {
        while ( !finished )
        {
            // Do stuff
        }

    }
    // Can be used to shut the application down from other classes, without having the actual object
    public static void endApplication()
    {
        MainLoop.finished = true;
    }

}

这是我应该避免的事情吗?传递一个对象以便您可以使用对象方法是否更好?是否是布尔值finished现在算作全球性的,还是同样安全?


在这种情况下使用静态变量的一个问题是,如果您创建两个(或更多)MainLoop 实例,则编写看起来只关闭其中一个实例的代码,实际上会关闭它们两个:

MainLoop mainLoop1 = new MainLoop();
MainLoop mainLoop2 = new MainLoop();

new Thread(mainLoop1).start();
new Thread(mainLoop2).start();

mainLoop1.finished = true; // static variable also shuts down mainLoop2 

这只是选择不使用静态变量的原因之一(众多原因之一)。即使您的程序今天只创建一个 MainLoop,将来您也可能有理由创建其中许多:用于单元测试,或实现一项很酷的新功能。

您可能会想“如果发生这种情况,我只会重构程序以使用成员变量而不是静态变量。”但预先支付成本并从一开始就将模块化设计融入到程序中通常会更有效。

毫无疑问,静态通常会使快速而肮脏的程序更容易编写。但对于您打算在未来几年测试、维护、增长、共享和使用的重要/复杂代码,通常建议不要使用静态变量。

正如这个问题的其他答案所指出的,静态变量是一种全局变量。有很多关于原因的信息(通常)global http://c2.com/cgi/wiki?GlobalVariablesAreBad 变量 https://stackoverflow.com/questions/872943/why-are-global-variables-bad-in-a-single-threaded-non-os-embedded-application are https://stackoverflow.com/questions/484635/are-global-variables-bad bad http://bytes.com/topic/c/insights/737451-case-against-global-variables.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java静态方法的优缺点 的相关文章

随机推荐

  • 当我更改为 RTL 时,material-ui 图标不会翻转

    我用过瑞安 科格斯韦尔的回答 https stackoverflow com questions 62799638 material ui textfield not affected with the rtl direction让我的项目
  • 开源 FSK 解码器库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Phabricator 第一次“弧线土地”失败

    我已经安装并配置了 Phabricator 因此它在网络上没有显示任何警告 然后我尝试创建一个存储库并进行第一次 git 提交 我已接受修订 但是当我尝试执行 arc land 时 它失败并显示以下消息 gt arc land Landin
  • 修改$PATH变量

    尝试安装node js Did brew install node 似乎已经奏效了 然而 完成后收到此消息 自制安装了 npm 我们建议将以下路径添加到您的PATH环境变量来获取 npm 安装的二进制文件 usr local share n
  • 如何将 Promise 与 Angular.js 和 $resource 与查询字符串一起使用?

    使用需要传递给它的查询字符串 参数的资源来处理 Angular js 中的承诺的最佳方法是什么 我已经看到 q 的工作在工厂 控制器和路由器中处理 但我不确定在涉及参数时如何处理它 所以如果这是工厂 angular module Anima
  • Firebase 身份验证失败并出现 FirebaseException:JsonResponse 实例化失败

    Problem 我刚刚为我的其中一个创建了更新Xamarin Forms应用程序 现在我遇到的问题是Firebase登录工作流程突然中断after上传新的 aab到 Google Play 到目前为止一直运行良好 当我尝试登录时 选择 Go
  • 将重复行的其他列替换为第一个唯一值并创建查找

    这是数据 Account Number Dummy Account 1050080713252 ACC0000000000001 1050223213427 ACC0000000000002 1050080713252 ACC0000000
  • jQuery 可通过溢出进行排序:隐藏;两个列表之间

    我有两个列表 使用 jQuery 可排序我可以在它们之间移动项目 productsList orderList sortable connectWith containerDiv disableSelection 但是 当我想使用自定义滚动
  • ParseInt 未转换为所需的类型

    这是我的代码 包主 import fmt reflect strconv func main i strconv ParseInt 10 10 8 fmt Println reflect TypeOf i 我预计i长度为 8 位 第三个参数
  • 如何在 Android 中打开 MS Office 文件 [重复]

    这个问题在这里已经有答案了 可能的重复 Android Microsoft Office 库 doc docx xls ppt 等 https stackoverflow com questions 4854947 android micr
  • Excel VBA - 删除最多*单词*的字符串内容

    我正在尝试删除字符串内容 直至字符串中包含的某个单词 例如 Emily has wild flowers They are red and blue 我想使用 VBA 来替换它 They are red and blue 即删除 他们 一词
  • YouTube Data API v3:无需打开浏览器即可从服务器上传视频

    我每天尝试从我的服务器上传视频到我的帐户 但浏览器无法访问 我可以在桌面上执行此操作 通过运行下面提到的脚本打开浏览器 请求我的权限并完成上传视频所需的完整授权 然后上传视频 python upload video py file clip
  • 我可以转换对象并访问 C++ 中的私有数据成员吗?

    我想访问类中的私有数据成员 类中没有成员函数来访问私有数据成员 这是私人的 我想上这门课 想知道如何打开它 一种方法是复制类的声明 将私有成员设为公共 然后将新类称为 some else 然后我重新解释转换并复制原始对象 这有效 但我想要一
  • 只做如果一天...批处理文件

    你好 我有一个批处理文件 如下所示 if day monday tuesday wednesday thursday friday goto yes else goto no 现在我知道第一行不起作用 我真正想要发生的事情 它会自动检查今天
  • 如何让通用ListView只显示用户的列表?

    我是 Django 新手 这是我第一次使用基于类的视图 我想使用通用 ListView 来显示用户拥有的 表 列表 到目前为止 我已经让它显示数据库中的所有表 但我只希望它显示登录用户的表格 这就是我的观点 from django shor
  • gcc -Wpadded 不提供任何警告

    我正在尝试使用 gcc 的 Wpadded 选项来了解 gcc 是否可以帮助我找出结构是否已填充 这是下面的代码 include
  • 从 R 中的 ca.jo 中的 Johannsen 协整方法估计 t 统计量

    我正在研究 R 中 vars 库中的小插图工作示例 我了解小插图中的大部分示例 除了小插图的表 5here https cran r project org web packages vars vignettes vars pdf 运行以下
  • Haskell 中具有多个参数的部分应用程序

    给定某个函数 f x1 x2 x3 xN 在多个地方部分应用它通常很有用 例如 对于 N 3 我们可以定义 g x f 1 x 3 然而 Haskell 中的标准部分应用程序并不是这样工作的 它只允许我们通过修复函数的第一个参数来部分应用函
  • 当基本词以 I 开头时,如何命名接口?

    我想为 Items 创建一个界面 通常 我会通过在基本词中添加 I 前缀来命名接口 但在这种情况下 我的基本词已经以 I 开头 以下是我的一些想法 IItem 两个我 Iitem 情况不同 项目接口 跳过I前缀 写出Interface 什么
  • Java静态方法的优缺点

    我以前没有使用过很多静态方法 但最近我倾向于使用更多静态方法 例如 如果我想在类中设置一个布尔标志 或者访问一个类而不需要通过类传递实际对象 例如 public class MainLoop private static volatile