Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用静态变量和方法的好处_Java_Variables_Methods_Static - Fatal编程技术网

在Java中使用静态变量和方法的好处

在Java中使用静态变量和方法的好处,java,variables,methods,static,Java,Variables,Methods,Static,在Java中使用静态变量和方法的所有好处是什么?静态变量的好处: 可以定义常量,而不需要 占用额外内存(一个用于 (每班) 可以访问常量 没有类的实例化 静态方法的好处: 独立于实例的行为可以是 无需担心意外 与的实例的交互 阶级 关于静态文件的使用一直存在争论。当您将变量或方法设置为静态时,它们不再是继承的主题,这会降低它们的灵活性(例如,单元测试问题)。也就是说,如果静态方法不需要实例,那么它们是有用的。一个典型的例子是java.lang.Math的方法,大多数人都同意静态在这里很好。

在Java中使用静态变量和方法的所有好处是什么?

静态变量的好处:

  • 可以定义常量,而不需要 占用额外内存(一个用于 (每班)
  • 可以访问常量 没有类的实例化
静态方法的好处:

  • 独立于实例的行为可以是 无需担心意外 与的实例的交互 阶级

关于静态文件的使用一直存在争论。当您将变量或方法设置为静态时,它们不再是继承的主题,这会降低它们的灵活性(例如,单元测试问题)。也就是说,如果静态方法不需要实例,那么它们是有用的。一个典型的例子是
java.lang.Math
的方法,大多数人都同意静态在这里很好。另一个用途是使用工厂方法作为“起点”,以便与库或框架交互,比如获取初始JNDI上下文或JPA的EntityManager。然而,工厂不应该被过度使用,一旦你手中有了东西,你就不需要再给工厂打电话了。工厂方法的现代替代品是依赖注入(例如,在Spring、Guice或EJB3.x中)。静态变量通常用于“常量”(如
Math.PI
)。枚举是使用这种技术在内部实现的。请注意,旧的Singleton模式现在被认为是潜在的危险(例如,假设您需要引入池来提高性能),如果您真的想要实现Singleton,最好的方法似乎是使用只有一个元素的Enum类。静态变量的其他用途包括注册表或全局属性,但正如您所猜测的,这也不是很灵活,应该避免。出于性能方面的原因,重用“服务对象”(我不知道这类对象有一个定义良好的名称)可能是好的,因为通过使它们成为静态(日历、随机、格式化程序,如DateFormat、Logger)来创建这些对象的成本很高,但要小心避免线程问题


因此,方法和变量永远不应该仅仅为了给它们找个位置而变得静态。它们与OO原则(特别是继承)相冲突,往往缺乏灵活性,难以重构和测试。对于真实的、不可变的常量(“服务对象”)或完全与对象无关的方法,静态的使用是很好的选择(但通常枚举是更好的选择)。当需要工厂时,它们可能是一个解决方案(但是,考虑依赖注入或服务提供者接口)。尽量避免其他用法

我并不特别喜欢。静态方法和变量肯定存在线程安全问题(优点和缺点),但基本原理与类的实例应用相同。示例:您可能不想在类中执行
public synchronized void foo(){}
,因为其他人可以在该对象的监视器上进行同步,而您将被锁定。以同样的方式,您将避免使用静态同步的
方法。它们不是继承的,而是可见的。这是不同的,例如,不能使用
super
访问基类的静态方法,不能有抽象静态成员。。。主要问题之一是无法表示(例如,在接口中)存在静态方法:如果所有扩展Number的类都需要实现valueOf(String)方法,那就好了,但这是不可表示的。