当前位置: 首页 > 知识库问答 >
问题:

将方法声明为静态的有什么好处

孟英叡
2023-03-14

我最近在Eclipse中查看了我的警告,发现了这样一个警告:

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

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

如果启用,编译器将为私有或最终的方法以及仅引用静态成员的方法发出错误或警告。

是的。我知道我可以关掉它,但我想知道打开它的原因?

为什么将所有可能的方法声明为静态方法是一件好事呢?

这会给性能带来什么好处吗?(在移动域中)

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

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

您是否认为这只是额外的关键字弄脏了代码,因为编译器将只是内联这些方法?(有点像你并不声明每一个变量可以final,但你可以)。

共有2个答案

虞裕
2023-03-14

这里没有优化的概念。

static方法是static,因为您显式声明该方法不依赖封闭类的任何实例,只是因为它不需要这样做。因此Eclipse警告(如文档中所述):

如果启用,编译器将为私有或最终的方法以及仅引用静态成员的方法发出错误或警告。

如果您不需要任何实例变量,并且您的方法是私有的(不能从外部调用)或最终的(不能重写),那么就没有理由让它成为一个普通的方法而不是静态的方法。静态方法本质上更安全,即使只是因为允许您用它做更少的事情(它不需要任何实例,您没有任何隐式this对象)。

东方华晖
2023-03-14

无论何时编写方法,都是在给定范围内履行契约。范围越窄,编写bug的几率就越小。

当一个方法是静态的时,你不能访问非静态的成员;因此,你的范围就更窄了。那么,如果您不需要也永远不需要(即使在子类中)非静态成员来履行您的契约,为什么要将对这些字段的访问权授予您的方法呢?在这种情况下声明方法statice将让编译器检查您没有使用不打算使用的成员。

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

这就是为什么在实际实现静态契约时声明方法statice是很好的。

在某些情况下,您的方法只意味着与您的类的一个实例相关的一些东西,而且碰巧它的实现实际上并没有使用任何非静态字段或实例。在这种情况下,您不会将方法标记为static

不使用static关键字的示例:

  • 什么都不做的扩展钩子(但可以对子类中的实例数据做一些事情)
  • 一个非常简单的默认行为,用于在子类中自定义。
  • 事件处理程序实现:实现将随事件处理程序的类而异,但不会使用事件处理程序实例的任何属性。
 类似资料:
  • 问题内容: 如果该方法可以声明为静态方法,则会向编译器发出警告。 [edit] Eclipse帮助中的确切引号,重点是私有和最终的: 启用后,编译器将为私有或最终方法(仅引用静态成员)发出错误或警告。 是的,我知道我可以将其关闭,但是我想知道打开它的原因吗? 为什么将每个方法都声明为静态是一件好事? 这会给性能带来任何好处吗?(在移动域中) 指出一种方法是静态的,我想表明您不使用任何实例变量,因此

  • 问题内容: 为什么将Java常量声明为static? 在此我了解使用final吗?购买为什么它必须是静态的?为什么它应该是类变量,而不是实例变量? 问题答案: 如果它可以随类的实例而变化,那么显然它不是 常数 。为的每个实例获得不同的pi值意味着什么(甚至不允许构造实例)?还是每个实例的大小写不区分大小写?

  • 问题内容: 我试图找到为什么不能将类创建为静态类的原因?喜欢: 问题答案: 在Java中,关键字通常将一个方法或字段标记为不存在,而不是每个类实例一次,而是一次。一个类一旦存在就已经存在,因此实际上,所有类都以这种方式是“静态的”,并且所有对象都是该类的实例。 确实对 内部 类具有含义,这是完全不同的:通常,内部类实例可以访问与其绑定的外部类实例的成员,但是如果内部类为,则它没有这样的引用并且可以

  • 问题内容: 这可能表明我缺乏Java理解,但是我想知道为什么在大多数MapReduce程序中,映射器和reducer类都声明为静态的? 问题答案: 当将mapper和reducer类声明为另一个类的内部类时,必须将它们声明为静态的,以便它们不依赖于父类。 Hadoop使用反射为每个映射创建该类的实例或减少运行的任务。创建的新实例需要一个零参数构造函数(否则它将如何知道要传递的内容)。 通过声明内部

  • 问题内容: 我注意到有些人喜欢将对象声明为它实现的接口之一, 即使在变量的范围内,也不必将其视为接口 ,例如,没有期望接口的外部API。 例如: 或者你可以做 并避免完全导入。 与类本身(第二个)相反,通过接口(上面的第一个)声明它有什么好处? 谢谢 问题答案: 如果以后不使用该变量,则没有优点/缺点。使用接口而不是对象的原因是为了提供更大的灵活性,但是,如果不使用该变量,则与性能方面没有什么区别

  • 问题内容: 我正在为某门课程的一些代码编写解释,并且偶然使用了这些单词并且可以互换使用。我决定回过头来修正措辞,但在我的理解上遇到了一个漏洞。 据我了解,子例程是一个如果它不作用于一个类的实例(其作用仅限于其显式输入/输出),并且是一个如果它作用于一个类的实例(它可能带有消除导致实例不纯的副作用)。 这里有一个很好的讨论主题。请注意,根据接受的答案的定义,静态实际上应该是一个函数,因为永远不会隐式