【问题标题】:Is it a good practice to have a java class with just having one static variable? [closed]拥有一个只有一个静态变量的 java 类是一种好习惯吗? [关闭]
【发布时间】:2020-07-14 21:19:53
【问题描述】:

我需要在一个变量中存储一些值,该变量可以从一个类写入并从另一个类读取,所以基本上我需要将写入类隐藏到读取类。
那么将该变量作为静态变量放在单独的类中会是一个不错的选择吗?这个项目是关于 OSGI 框架的。

有什么设计模式可以解决这个问题吗?

【问题讨论】:

    标签: java design-patterns osgi design-principles


    【解决方案1】:

    您最好创建一个接口来提供相关值。示例:

    Interface weighable {
       int getWeight();
    }
    
     class dog implements Weighable {
         private int weight;
         public getWeight() {
             return weight;
         }
         public void setWeight(int weight){
             this.weight = weight;
         }
     }
    
     class person implements Weighable
    
    
     Class AirfreightCalculator {
        float calculateFreightPrice (Weighable w)
        .... calc details here
      }
    
    
      AirfreightCalculator fc = new AirfreightCalculator();
      Dog d = new Dog();
      dog.setWeight(30);
      price = fc.calculateFreightPrice(d);
    

    显然,这是一种情况。您的情况可能有所不同,但您需要提供更多详细信息。

    我可以向您指出这篇文章:https://medium.com/@ronnieschaniel/object-oriented-design-patterns-explained-using-practical-examples-84807445b092,这可能会进一步帮助您。

    【讨论】:

    • 你能指出具体的设计模式吗
    • 我的意思是您需要熟悉这些设计模式,然后选择最合适的一种。否则,您将永远依赖他人,并可能得到不好的建议。
    • 我基本上需要一个变量在两个不同的类之间共享。例如,A 类和 B 类需要访问程序中的共享变量。所以 A 类将改变这一点来自类内部方法的变量,它也可以读取该变量。B类基本上只会读取由A类写入的值,但是如果我将该变量作为静态变量存储在A类中,那么B类将看到该类A在使用时的名称我也需要停止它。所以在哪里存储它。我的意思是B类出于任何原因无法访问A类。
    • 我给你的例子行不通?如果你使用一个接口,A实现了那个接口,B通过接口读取值,那么B类就和A类解耦了,它只知道接口。此外,您可能希望查看观察者模式,以便让 B 类通知 A 类对该值所做的任何更改。
    • B类如何通过接口读取它?如果你能通过一个简单的例子来展示它,只有设置值和读取值部分会很棒
    【解决方案2】:

    既然您使用的是 OSGi,为什么不将对象注册为 OSGi 服务。然后消费对象的一方可以在服务注册中心找到它,并且不需要知道创建和注册对象的任何一方。

    OSGi 服务注册表充当代理,因此提供者和消费者不需要知道对方的任何细节。

    【讨论】:

    • 你能告诉我怎么做吗,我的意思是我需要在不同的消费者和生产者之间共享这个变量,这样生产者就可以进行修改,其他消费者会消费它.您有任何资源或任何类型的示例,因为我是 OSGI 的初学者。
    • 查看 OSGi 声明式服务。它提供了一种基于注解的编程方法来注册和使用服务。
    【解决方案3】:

    听起来您正在寻找一个类来充当其他 2 个类的中间容器。例如:

    public class DataStore {
      private Object _data;
      public void setData(Object data) { _data = data; }
      public Object getData() { return _data; }
    }
    

    然后您可以使用它在其他两个类之间传递数据,例如:

    public class A {
      private DataSource _ds;
      public A(DataSource ds) { _ds = ds; }
    
      public void doSomething() {
        _ds.setData("hello");
      }
    }
    
    public class B {
      private DataSource _ds;
      public B(DataSource ds) { _ds = ds; }
    
      public void doSomething() {
        System.out.println(_ds.getData());
      }
    }
    

    然后你会这样使用它:

    DataSource ds = new DataSource();
    A a = new A(ds);
    B a = new B(ds);
    a.doSomething();
    b.doSomething();
    

    【讨论】:

    • 是的,基本上你的想法和我的一样,我试图将它作为静态变量存储在 DatasSource 类中,而忽略对象的创建、getter 和 setter。我的意思是我可以用类名直接设置它.propertyName 并通过 class.propertyName 直接读取。
    • @HasinduDahanayake 一般来说,使用静态变量,也就是“全局状态”,是个坏主意。在少数情况下它是有意义的,但通常它是一个糟糕的设计,稍后会导致问题。除非有理由你不能像展示的那样使用共享实例,否则你绝对应该使用我展示的方法的一些变体
    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2021-03-25
    • 1970-01-01
    • 2015-08-03
    • 2020-08-25
    • 1970-01-01
    • 2023-02-19
    • 2016-12-22
    相关资源
    最近更新 更多