1

所以,我正在开发一个需要本地数据库连接并使用一些 Web 服务来回发送和接收数据的应用程序。

  • 每当我需要和数据库操作时,我都会创建我的 DbConnection类的一个对象(这是我用来获取我的数据库的类的名称)并对其执行操作。

  • 同样,为了连接互联网,我使用DefaultHttpClient并创建一个static相同的对象,并且每当需要连接并调用Web服务时,我都会创建HttpResponse对象并获取响应数据。

1)我是否使用了正确的方法或模式?

2)还有一件事专注于第2点,静态和单例的工作方式是否相同?

4

4 回答 4

4

我是否使用了正确的方法或模式?

我不这么认为。如果您使用单例(或静态)进行连接,那么如果您的代码需要在可能需要多个连接的上下文中使用/重用,那么您会很困难;例如,如果你让你的应用程序多线程,或者把它变成一个库。

单例在可测试性方面也存在问题......

一般来说,你可以用单例(或静态)做任何事情,你也可以用某种上下文参数来做。依赖注入 (DI) 框架提供了一种简洁的方法来创建共享对象并将它们“连接”到需要它们的其他对象中……而不使用单例或静态。或者,您可以通过多种方式手动完成。

静态和单例的工作方式相同吗?

单例是一种设计模式。静态是可用于实现单例模式的 Java 语言特性。所以它们不是同一种东西(甚至不是同一种东西),但它们是相关的。

于 2013-03-24T14:24:58.230 回答
1

没有单身人士总是不好的。避免使用它们,除非你被迫使用它们(因为一些愚蠢的框架没有给你其他选择)

  • 他们没有意义,全局变量是什么意思?如果你有多个类加载器怎么办?如果你两次运行同一个程序会怎样?
  • 它们导致隐藏的时间耦合。单例 A 必须在单例 B 之前初始化,但不能在单例 C 或单例 D 之前初始化。大多数人甚至不知道如何在 Java 中控制单例的初始化时间。(基本上你必须触摸一个静态字段以确保它已初始化,但不要太早触摸它,否则你会破坏顺序!)
  • 如果您处于安全环境(例如 securitymanager)或安全语言(例如 E)中,它们会导致安全漏洞。
  • 很难让它们在多线程代码中工作。很难,世界上只有几千人知道如何用像 Java 这样的语言“正确”地做到这一点,这仍然需要模块间分析才能正确,除非你简单地编码一些模仿演员模型的东西,这打败了java并发的目的
  • Java 语言规范 (gilad bracha) 的合著者甚至说单例是可怕的,并在没有它们的情况下创造了一种新语言 (newspeak)

要么传递一些对象,要么面临上述问题以及我可能忘记提及的更多问题。为什么在 2013 年仍然存在这样的世俗问题,我无法理解。

于 2013-03-24T14:46:05.520 回答
0

哇。你的问题比你想象的要多得多,但是为了给你一个简短的答案,我见过的大多数项目(不使用 ORM,你可能想要研究的东西)都会有一个包装类围绕调用所有适当查询的 DB 对象,处理转义 &c。它将实现一个公共接口,以便它可以由工厂类提供给期望匹配接口的东西。

至于单例/静态,那真的取决于你的需要。在我上面提到的模式中,Singleton 要好得多:这意味着访问数据库的每个对象都能够存储对 db 对象的本地引用。这也意味着您可以将获取 Singleton 的过程封装在父类中。使用静态类不会为您提供该选项。

于 2013-03-24T14:25:36.483 回答
0

回答第 1 点 - 是的,单例是正确的方法。理想情况下,您必须只建立与数据库的单一连接。Sinleton 将帮助您实现这一目标。

回答第 2 点 - 没有静态不一定与单例相同。如果我们以单例模式多次调用创建对象,它返回相同的对象。但是如果多次调用create object,则可以多次创建静态对象。

但是您可以确保静态对象只创建一次,这将与单例模式相同。

于 2013-03-24T14:27:31.197 回答