Java 在可能的情况下,声明方法是静态的吗?

Java 在可能的情况下,声明方法是静态的吗?,java,oop,coding-style,Java,Oop,Coding Style,这是不言自明的。在Java(以及我想的所有OO语言)中,当实例方法是唯一的选择还是我们通常不关心它时,我应该声明实例方法吗?是的 这是正确的方法,至少我是这样做的 例如,实用程序方法应该是静态的 但是,大多数情况下,未来需要很多需求和更改,我们今天无法看到所有这些需求和更改。因此,实例应该优先于静态。除非你遵循某种设计模式。一般来说,如果你使用很多静态方法,你就很难对你的代码进行单元测试(人们认为用模拟的方法来模拟对象比用类似的方法模拟静态方法更容易)。 但是,如果您不关心这一点,并且该方法不使

这是不言自明的。在Java(以及我想的所有OO语言)中,当实例方法是唯一的选择还是我们通常不关心它时,我应该声明实例方法吗?

是的

这是正确的方法,至少我是这样做的

例如,实用程序方法应该是静态的


但是,大多数情况下,未来需要很多需求和更改,我们今天无法看到所有这些需求和更改。因此,实例应该优先于
静态
。除非你遵循某种设计模式。

一般来说,如果你使用很多静态方法,你就很难对你的代码进行单元测试(人们认为用模拟的方法来模拟对象比用类似的方法模拟静态方法更容易)。


但是,如果您不关心这一点,并且该方法不使用它所在类的实例数据,那么您可以将其设置为静态。

因此,您可以使用任何类型的实现。但标准应该是要求,而不是可能性。 如果要在类范围内执行某些操作,则应选择静态方法。例如,如果您必须为每个实例生成一些唯一的ID,或者您必须初始化实例将使用的任何东西,例如display或db driver。
在其他情况下,当操作特定于实例时,实例方法是首选的。

方法是静态的,当您不需要它们了解类状态来处理某些内容时。助手方法就是这个场景的好例子

DateUtils.getDateNowInGMT()
上述方法不需要任何状态即可给出答案。下面的一个可以

Withdrawer w = new Withdrawer.Builder().account(12545).build();
w.withdraw(100);

您不能在不知道与取款人关联的账号的情况下取款。当然,您可能会争辩说,这可能是一种静态方法,将帐户信息传递给该方法可以解决问题,但这会带来不便,因为所有其他方法都需要相同的帐户信息。

只有当方法是静态的时,才应该将其设置为静态。静态方法属于类,而不属于类的特定实例。静态方法只能使用类的其他静态特性。例如,静态方法无法调用实例方法或访问实例变量。如果这对您正在设计的方法有意义,那么使用静态方法是一个好主意

此外,静态元素,无论是变量还是方法,都会在类加载时加载到内存中,直到执行结束或类加载程序卸载/重新加载它所属的类为止

当静态方法用于进行不适合我的应用程序的一般面向对象建模的计算时,我使用静态方法。通常,验证输入数据或保存特定于整个应用程序执行的信息或访问外部数据库的点的方法等实用方法都是很好的选择

据我所知, 如果您有这样一个代码或逻辑,它利用或产生与特定对象状态相关的东西,或者简单地说,如果您的logic in side方法使用一些不同的输入集处理不同的对象,并产生一些不同的输出集,那么您需要将此方法作为实例方法。 另一方面,如果您的方法具有每个对象通用的逻辑,并且输入和输出不依赖于对象的状态,那么您应该将其声明为静态而不是实例

Explaination with examples:

    Suppose you are organizing a college party and you have to provide a common coupon to the students of all departments,you just need to appoint a person for distributing a common coupon to students(without knowing about his/her department and roll no.) as he/she(person) approaches to the coupon counter. 
    Now think if you want to give the coupons with different serial numbers according to the departments and roll number of students, the person appointed by you need to get the department name and roll number of student(as input from each and every student)
    and according to his/her department and roll number he will create a separate coupon with unique serial number.

First case is an example where we need static method, if we take it as instance method unnecessary it will increase the burden.

Second case is an example of instance method, where you need to treat each student(in sense of object) separately.

这个例子可能看起来很傻,但我希望它能帮助您清楚地理解其中的区别。

取决于需求。但这确实很重要!