这很不言自明。在 Java 中,(以及我想的所有 OO 语言)我应该在它是唯一选择时声明实例方法还是通常我们不关心它?
6 回答
当您不需要它们了解类状态来处理某些内容时,方法是静态的。辅助方法就是这种场景的好例子。
DateUtils.getDateNowInGMT()
上面的方法不需要任何状态给你答案。下面的那一个。
Withdrawer w = new Withdrawer.Builder().account(12545).build();
w.withdraw(100);
您不能在不知道与提款人关联的状态的帐号的情况下提取()钱。您当然可以争辩说,这可能是一个静态方法,将帐户信息传递给该方法可以解决问题,但这会带来不便,因为所有其他方法都需要相同的帐户信息。
一般来说,如果您使用大量静态方法,对您的代码进行单元测试会更加困难(人们认为使用类似 Mockito 的东西来模拟对象比使用类似Powermock的东西来模拟静态方法更容易)。
但是,如果您不关心这一点,并且该方法不使用它所在类的实例数据,那么您也可以将其设为静态。
是的。
这是正确的方法,至少我遵循了这一点。
例如,实用程序方法应该是静态的。
但是,大多数情况下还有很多未来的需求和变化,我们今天无法预见所有这些。所以 instance 应该优先于static
. 直到除非您遵循某种设计模式。
因此,您可以使用任何类型的实现。但不是可能性,标准应该是要求。如果你有一些操作要在类范围内执行,你应该选择静态方法。例如,如果您必须为每个实例生成一些 uniqueID,或者您必须初始化实例将使用的任何东西,例如显示或 db-driver。在其他情况下,如果操作是特定于实例的,则首选实例方法。
只有在对它们来说是静态的有意义时,才应该将方法设为静态。静态方法属于类而不属于它的特定实例。静态方法只能使用类的其他静态特性。例如,静态方法不能调用实例方法或访问实例变量。如果这对您正在设计的方法有意义,那么使用静态是个好主意。
此外,静态元素,无论是变量还是方法,都会在类加载时加载到内存中,并一直保留到执行结束或类加载器卸载/重新加载它所属的类时。
当静态方法用于执行不适合我的应用程序的一般面向对象建模的计算时,我会使用它们。通常实用方法,例如验证输入数据或保存特定于整个应用程序执行的信息,或访问外部数据库的方法是很好的候选者。
据我所知,如果您有这样的代码或逻辑使用或产生与特定对象状态相关的东西,或者简单地说,如果您的侧方法中的逻辑处理具有不同输入集的不同对象并产生一些不同的一组输出,您需要将此方法作为实例方法。另一方面,如果您的方法具有每个对象通用的逻辑并且输入和输出不依赖于对象的状态,您应该将其声明为静态而不是实例。
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.
这个例子可能看起来很傻,但我希望它能帮助你清楚地理解差异。