【问题标题】:Singleton with dynamic variable具有动态变量的单例
【发布时间】:2015-12-22 10:33:54
【问题描述】:

我需要调用函数来重新计算来自程序{不同类}的不同位置的参数。我需要使用可以在运行时间中更改的不同系数重新计算。 简单示例:new_value = old_value * 系数。

目前我有一个持有这些系数的类,并且有一些方法可以进行重新计算。缺点:我需要将该类的实例传递到我想使用它的每个地方。

这是我的单身:

public class Converter {
    private double              lbU_2_U;
    private static Converter    instance    = new Converter();

    public Converter() {
        lbU_2_U = 1;
    }

    public static Converter getInstance() {
        return instance;
    }

    public void updateVelocityCoeficient(double lb_2_p) {
        lbU_2_U = lb_2_p;
    }

    public double velToP(double lbU) {
        return lbU_2_U * lbU;
    }

    public double velToLB(double u) {
        return u / lbU_2_U;
    }
}

所以,现在的优势在于我可以在程序的任何地方编写

newVelocity = Converter.getInstance().velToP(velocity)

继续前进,我会这样做:

newVelocity = Converter.velToP(velocity)

所以我正在考虑将我的单例更改为:

public class Converter {
    private double              lbU_2_U;
    private static Converter    instance    = new Converter();

    public Converter() {
        lbU_2_U = 1;
    }

    public static Converter getInstance() {
        return instance;
    }

    public static void updateVelocityCoeficient(double lb_2_p) {
        instance.lbU_2_U = lb_2_p;
    }

    public static double velToP(double lbU) {
        return instance.lbU_2_U * lbU;
    }

    public static double velToLB(double u) {
        return u / instance.lbU_2_U;
    }
}

你怎么了? 我不确定这是否有效,我是否可以在多线程应用程序中使用它,以及这是否是使用 Singleton 的正确方式。

谢谢

【问题讨论】:

  • 那些标识符(变量/方法名)是神秘的。请使用更具描述性的标识符
  • 单例是一个概念,而不是正式的规范。更好的是理解概念。看到这个:stackoverflow.com/questions/228164/…
  • @elif 他有编程问题(无法实现动态性质),所以我认为它不适合 CodeReview
  • 有状态的单例是个坏主意。见Why is Global State so Evil?
  • 这不是真正的单例;我建议将您的构造函数设为私有。

标签: java


【解决方案1】:

这不是使用单例模式的好场景。

看看这些答案:When should the Singleton pattern NOT be used?

【讨论】:

    【解决方案2】:

    你不需要这是 Singleton - 你只需要一些 static 方法。

    public class Converter {
    
        private static double lbU_2_U = 1;
    
        private Converter() {
            // No non-static methods so disallow construction.
        }
    
        public static void updateVelocityCoeficient(double lb_2_p) {
            lbU_2_U = lb_2_p;
        }
    
        public static double velToP(double lbU) {
            return lbU_2_U * lbU;
        }
    
        public static double velToLB(double u) {
            return u / lbU_2_U;
        }
    }
    

    我不会在这里讨论你在这里使用的是好的还是坏的模式。

    【讨论】:

      【解决方案3】:

      这很好。但是:

      -你的构造函数应该是私有的,是一个单例。 (您是唯一能够创建实例的人)

      private Converter() {
          lbU_2_U = 1;
      }
      

      -我认为您不需要使用单例。你只需要一个

      private static double lbU_2_U;
      

      【讨论】:

      • 1) 是的,构造函数将是私有的,快速编写 2) 好吧,我需要在运行程序中更改 lbU_2_P 系数
      • 您可以在运行时更改静态属性。 "public void setlbU_2_P(double d)"
      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多