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,当处理需要相同变量实例的多个类时,创建一个中心类是否是一种良好的编程实践 chatWindow.variables.username = userField.getText(); 例如: 我有一个有一定数量变量的类 我还有一个类需要相同的变量 另一个需要与第一个相同的变量 我有三个类,它们都使用相同的变量实例 我仅使用第一个类(1)创建变量类实例 我通过类(1)使用类(2)、(3)访问这些变量 例如: (在classTwo()中时): 编辑:在基本形式中,我的问题是创建一个中心“变量类”并使用

当处理需要相同变量实例的多个类时,创建一个中心类是否是一种良好的编程实践

chatWindow.variables.username = userField.getText();
例如:

  • 我有一个有一定数量变量的类
  • 我还有一个类需要相同的变量
  • 另一个需要与第一个相同的变量
  • 我有三个类,它们都使用相同的变量实例

    我仅使用第一个类(1)创建变量类实例

    我通过类(1)使用类(2)、(3)访问这些变量

    例如: (在classTwo()中时):

    编辑:在基本形式中,我的问题是创建一个中心“变量类”并使用其他类通过一个主类访问它的相同属性是否合适


    我知道我的问题很难理解,但我相信还有另一种更简单的方法。我尝试将第一个类的同一个实例传递给第二个和第三个类的构造函数,但我的解决方案似乎更简单。

    听起来你没有很好地隔离类。类可以修改其他类变量,但我会避免在一个地方存储可变变量。这使得事情看起来像是很难管理和最好避免的全局变量。有关这方面的更多详细信息,请参阅。还可以查找有助于在程序中保持松散耦合的内容。

    由于缺少示例,我不太确定您需要什么,但可能您需要的是注册表模式

    基本上,您创建一个静态“全局”类,该类保存整个应用程序所需的所有变量

    public abstract final class VarRegistry {
        public static final String var1 = "val1";
        public static final int var2 = 2;
    }
    
    现在,在所有需要访问这些变量的类中,您可以轻松地访问和修改它们:

    VarRegistry.var1 = "test";
    
    在开始编写代码之前,请稍等片刻:不建议使用这样的“全局”变量。它破坏了数据封装,因为您永远不知道这些变量何时被更改以及由谁更改


    您最好重新构造您的程序,以支持更安全的模式,从而正确地启用您的数据,例如依赖项注入。

    最佳做法是使用依赖项注入并传递您需要的所有资源,而不是让类找到它们想要的

    使用全局变量一开始就比较简单,但随着应用程序的发展和您想要使用单元测试,这些都是一个真正的难题,因为管理和维护这些变量变得更加困难。

    这听起来像。。。这样做的时候,你的模型好像有问题

    如果有一组变量需要在多个类中更改,那么它可能应该成为一个对象(甚至可能是一个实体)。但是,您应该考虑如果需要在其他类中更改这些值,则可能需要在同一类中添加一些逻辑(以进行验证检查等)。


    有一个额外的类来保存变量通常被认为是一种代码味道,称为贫血域。然而,有些案例确实需要这样做,而且这可能是一个品味的问题。在这种情况下,您的类只不过是一个美化的结构。

    每个问题都有自己的最佳折衷方案,您应该问自己一系列问题。 (2)和(3)是否只需要对(1)进行就绪访问,还是还需要进行写访问

    您实际正在做的事情(从(1)创建(2)和(3)看起来不错,构建器模式,您创建了您从未直接访问过的IStance)

    如果需要写访问权限,是否应将(3)(或反之亦然)所做的更改通知(2)

    通常,您应该尽可能多地限制来自“子类”的交互(理想情况下,如果可能,最好尽量避免共享某些内容,但通常是这样),因此从(1)中访问它们似乎比从(2)和(3)中访问(1)更好

    这种限制增加了代码的可维护性,并消除/减少了诸如值更改通知、谁拥有谁等问题

    基本上,如果用户只需要对(1)保持警惕,并且所有其他内容都在内部处理,那么您已经做得很好了(Pimpl习语对您没有任何意义?)

    您还可以对(1)进行类似于(2)和(3)的扩展,因此其行为完全类似于策略模式。其优点是:(1)只需对istances保持警惕,但如果将来需要进一步扩展(1)您已经准备好了策略,可以用最少的努力进行更新。(我总是注意到,在您可以编写的每个代码中,总是存在多个模式)


    最后,你是唯一一个知道所有代码细节的人,经常问问自己是否可以提高代码的可维护性、易读性等,以及需要升级的地方等。

    你能提供更多关于你的类的细节吗?帮助他们可能会更容易。你说的需要相同的变量是什么意思?您想在其他类中使用这些变量,还是只将它们作为其他类的属性继承?您要问的是所谓的。不建议使用它,请参阅问题。我会对实用程序类使用枚举。抽象类可以有子类。;)不能是
    abstract final
    我会使用带有私有构造函数的
    public enum VarRegistry{;
    作为final;@Truth:这不是一个单例,只是一个引用其他类的类,即使是一个场景图也有类似的结构,其中有多个子引用它们的父类。
    VarRegistry.var1 = "test";