【发布时间】:2011-08-13 08:11:55
【问题描述】:
在 Java 中使用静态变量和方法有哪些好处?
【问题讨论】:
标签: java variables methods static
在 Java 中使用静态变量和方法有哪些好处?
【问题讨论】:
标签: java variables methods static
关于静态的使用一直存在争议。当您将变量或方法设为静态时,它们不再是继承的主题,这使得它们不太灵活(例如单元测试的问题)。也就是说,如果不需要实例,静态方法很有用。一个典型的例子是java.lang.Math 的方法,大多数人会同意静态在这里很好。另一个用途是将工厂方法作为“起点”,以便与库或框架进行交互,例如获取初始 JNDI 上下文或 JPA 的 EntityManager。但是,工厂不应该被过度使用,一旦你手中有东西,你不应该再次调用工厂。工厂方法的现代替代品是依赖注入(例如在 Spring、Guice 或 EJB 3.x 中)。静态变量通常用于“常量”(如Math.PI)。枚举是使用这种技术在内部实现的。请注意,旧的单例模式现在被认为具有潜在危险(例如,假设您需要引入池来提高性能),如果您真的想要实现单例,最好的方法似乎是枚举只有一个元素的类。静态变量的其他用途包括注册表或全局属性之类的东西,但是您可以猜到,这又不是很灵活,应该避免使用。出于性能原因,可能可以重用“服务对象”(我不知道这些对象有明确定义的名称),通过将它们设为静态(日历,随机的格式化程序,如 DateFormat、Logger),但要小心避免线程问题。
因此,方法和变量永远不应该只是为了给它们找个地方而变成静态的。它们与 OO 原则(尤其是继承)相冲突,往往不灵活,难以重构和测试。静态的使用适用于真实的、不可变的常量(但通常枚举是更好的选择)、“服务对象”或完全独立于对象的方法。当需要工厂时,它们可能是一种解决方案(但是,请考虑依赖注入或服务提供者接口)。尽量避免其他用途。
【讨论】:
super访问你的基类的静态方法,你不能有抽象的静态成员......主要问题之一是没有办法表达(例如在接口中)静态方法存在:如果所有扩展 Number 的类都需要实现 valueOf(String) 方法,那就太好了,但这根本无法表达。
静态变量的好处:
静态方法的好处:
【讨论】:
public synchronized void foo() { },因为其他人可以在该对象的监视器上进行同步,而您将被锁定。以同样的方式,您将避免使用static synchronized 方法。