【问题标题】:Should I have static init() called before any instance is created我是否应该在创建任何实例之前调用静态 init()
【发布时间】:2013-12-11 11:16:10
【问题描述】:

我有一个类,它初始化与我们正在处理的服务器之一的连接,然后订阅服务器上的各种事件,然后在收到订阅通知后在同一台服务器上执行各种事务。

我创建了连接对象static,以便在所有实例中始终打开到服务器的单个连接。问题是服务器上的那些事务只有在收到通知时才需要完成。而且由于我订阅了不同类型的通知,我不知道哪个线程将首先创建类的实例并执行事务。

简而言之,我无法确定将在何时何地创建类实例。但是对于所有这些情况,我希望使用相同的连接。所以我希望在创建任何类实例之前初始化该连接。所以我创建了static init(params) 并通过调用Class.init(params) 初始化了该连接。每次通知发生时,我只需调用默认构造函数对其执行事务。

但不知何故,首先在类上调用init() 方法,然后在某个时间调用默认构造函数以获取实例后某处是我第一次做的事情,因此不知道这是否是正确的方法。

【问题讨论】:

  • C# 但我认为它不会有任何区别
  • 每种语言都有自己的语法和规则,因此适用于这种不太常见的情况可能会有所不同。
  • 我会看到一个示例代码,但它看起来有点懒惰(对象创建被推迟到最后一刻)。味道不错,你有什么顾虑?
  • 单例与否并不会让您“更加 OOP”。 做最适合您的场景的事情(在可读性、性能和可维护性方面)
  • 权利可能会让我满意,会考虑更多,否则会提出新问题:p

标签: c# java oop design-patterns


【解决方案1】:

在 java 中你可以使用 static{} 语句(不是方法,而是在类实例化之前执行的静态代码块)...在 C# 中我不知道你该怎么做。

但是...为什么不使用单例模式进行连接?

【讨论】:

  • C#中有静态构造函数,但无论如何我都不能同时传递参数
  • 因为这个类可以有多个实例。我相信只有在外部施加这种约束时,我才应该单例。在这里,拥有多个实例是没有问题的。但是如果让这个类的多个实例同时运行一些方法会导致问题,那么我会考虑制作单例。
  • 哦,如果我需要跨实例共享一些变量,我应该总是选择单例吗?我认为它需要static 成员。我错了吗?
  • 罗马人说的。连接与使用它的事物不同。使其成为自己的(单例)类。单例优于静态,因为您可以在需要时交换单例实现,但不能交换静态方法。
  • 是的,他们写的正是我所说的:使用单例(仅)进行连接。一个想法可以是将其包装在您的类中(并为您的共享属性提供 setter/getter)。
猜你喜欢
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2021-12-08
相关资源
最近更新 更多