问题

我最近在Eclipse中查看了我的警告并遇到了这个问题:

static warning

如果该方法可以声明为静态,它将给出编译器警告。

**[编辑]**Eclipse帮助中的精确引用,强调私有和最终:

启用后,编译器将对private或final方法发出错误或警告,并且仅引用静态成员。

是的我知道我可以关掉它,但是我想知道打开它的原因是什么?**
为什么将每个方法声明为静态是一件好事?
这会带来任何性能优势吗? (在移动域中)

指出一个方法为静态,我想是显示你不使用任何实例变量因此可以移动到utils样式类?

在一天结束时,我应该关闭"忽略",还是应该修复它给我的100个警告?

你是否认为这只是代码的额外关键字,因为编译器无论如何都只会内联这些方法? (有点像你没有声明每个变量,你可以最终但你可以)。


#1 热门回答(129 赞)

无论何时编写方法,你都可以在给定范围内履行合同。范围越窄,你编写错误的机会就越小。

当方法是静态的时,你无法访问非静态成员;因此,你的范围更窄。因此,如果你不需要并且永远不需要(甚至在子类中)非静态成员来履行你的合同,为什么要为你的方法提供对这些字段的访问权限?在这种情况下声明方法static将让编译器检查你是否使用了不打算使用的成员。

而且,它将帮助阅读代码的人了解合同的性质。

这就是为什么当它实际实现静态契约时声明方法static被认为是好的。

在某些情况下,你的方法仅表示与你的类的实例相关的内容,并且它的实现实际上并不使用任何非静态字段或实例。在这种情况下,你不会标记方法static

你不使用static关键字的示例:

  • 一个什么都不做的扩展钩子(但可以用子类中的实例数据做某事)
  • 一个非常简单的默认行为,可以在子类中进行自定义。
  • 事件处理程序实现:实现将随事件处理程序的类而变化,但不会使用事件处理程序实例的任何属性。

#2 热门回答(12 赞)

这里没有优化的概念。

Astatic方法是static因为你明确声明该方法不依赖于封闭类的任何实例,因为它不需要。所以Eclipse警告,如文档中所述:

启用后,编译器将对private或final方法发出错误或警告,并且仅引用静态成员。

如果你不需要任何实例变量并且你的方法是私有的(不能从外部调用)或者final(不能被覆盖)那么就没有理由让它成为普通方法而不是静态方法。静态方法本质上更安全,即使只是因为你可以用它做更少的事情(它不需要任何实例,你没有任何隐含的this对象)。


#3 热门回答(6 赞)

我没有关于性能的信息,我认为它最多略微好一些,因为代码不需要根据类型进行动态调度。

然而,反对重构为静态方法的更强有力的论据是,目前使用静态被认为是不好的做法。静态方法/变量不能很好地集成到面向对象的语言中,并且难以正确测试。这就是为什么一些较新的语言完全放弃静态方法/变量的概念,或者试图以一种在OO中更好地发挥作用的方式将其内化到语言中(例如Scala中的对象)。

大多数情况下,你需要静态方法来实现仅使用参数作为输入并使用它生成输出的函数(例如,实用程序/辅助函数)在现代语言中,有一个允许的第一类函数概念,所以静态不需要。 Java 8将集成lambda表达式,因此我们已经朝着这个方向发展。


原文链接