我想知道什么时候使用静态方法?假设我有一个类,有几个getter和setter,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法?

例子:

Obj x = new Obj();
x.someMethod();

或:

Obj.someMethod(); // Is this the static way?

我很困惑!


当前回答

静态方法与实例不关联,因此它们不能访问类中的任何非静态字段。

如果方法不使用类的任何字段(或仅使用静态字段),则使用静态方法。

如果使用类的任何非静态字段,则必须使用非静态方法。

其他回答

不,静态方法不与实例关联;他们属于这个阶层。静态方法是第二个例子;实例方法是第一个。

静态方法应该在类上调用,实例方法应该在类的实例上调用。但这在现实中意味着什么呢?下面是一个有用的例子:

car类可能有一个名为Accelerate()的实例方法。你只能加速一个汽车,如果汽车确实存在(已经构造),因此这将是一个实例方法。

car类也可能有一个名为GetCarCount()的计数方法。这将返回创建(或构造)的汽车总数。如果没有构造汽车,这个方法将返回0,但它仍然可以被调用,因此它必须是一个静态方法。

静态的: Obj.someMethod

当你想要提供对方法的类级访问时,使用static,即在没有类实例的情况下,方法应该是可调用的。

只在以下场景下定义静态方法:

如果您正在编写实用程序类,并且它们不应该被更改。 如果该方法没有使用任何实例变量。 如果任何操作不依赖于实例创建。 如果有一些代码可以很容易地被所有实例方法共享,那么将这些代码提取到静态方法中。 如果您确定方法的定义永远不会被更改或重写。因为静态方法不能被覆盖。

在阅读了Misko的文章之后,我相信静态方法从测试的角度来看是不好的。相反,您应该使用工厂(可能使用像Guice这样的依赖注入工具)。

我如何确保我只有一个东西

只吃一种 问题是"我如何确保我 只吃一种东西”是很好的 回避了。实例化一个 单个ApplicationFactory在你的 主要的,结果,只有你 实例化所有的单个实例 你的独生子女。

静态方法的基本问题是它们是过程代码

静态方法的基本问题是 它们是过程代码。我没有 知道如何对过程代码进行单元测试。 单元测试假设我可以 实例化我的应用程序的一部分 在隔离。在实例化过程中 我将依赖项与 mock /友军替换 真正的依赖关系。与程序 编程没有什么可以“连接”的 由于没有对象,代码 数据是分开的。