对核心零件实例使用静态变量是不是很糟糕的设计



开发一个jogl应用程序,这是我们核心类结构的一部分

主 jFrame

  • 查看器(用于渲染(

    • 输入侦听器

    • 视杆(用于摄像机/投影控制(

    • 图形(保存节点/网格(

      • 图标处理程序(展开/折叠具有子节点的节点(

因此,如果我想在图标处理程序中调用methodX(((基本上是表示处理程序的纹理,对于所有节点都是一样的(,我必须调用:

Main.instance.getViewer().getGraph().getIconHandler().methodX()

其中 instance 是一个静态变量,用于保存主 jFrame 的实例

鉴于它们都是:

1( 实例化一次

2(在开始时

3(应该一直在那里

4(理论上,没有竞争条件的问题,我们在添加/读取/修改/删除节点时在较低级别使用java.util.concurrent.locks.ReentrantReadWriteLock

将每个类

的实例分配给每个相应类中的静态变量是危险/糟糕的设计吗?

这样,如果我想访问相同的methodX()我只需致电

IconHandler().instance.methodX()

Ps:我阅读了有关静态变量((的其他一些问题,但我发现它们非常通用,我的关于核心部分。

只要你知道每个类只需要一个实例,这就可以了。这称为单例,是一种非常著名的设计模式。

问题是你可能无法保证你只需要类的一个实例。单一实例适用于数据连接或文件读取器等功能,其中对应访问数据的实例数有内置限制。

您滥用 static 关键字作为访问类实例的懒惰方式,当您扩展程序以包含这些类的多个实例时,它会回来咬您。如果你认为你只需要一个实例 - 你不能保证它永远不会改变。

最新更新