【问题标题】:Is declaring a method static when possible good practice?在可能的情况下声明方法是静态的吗?
【发布时间】:2013-03-13 05:00:57
【问题描述】:

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

【问题讨论】:

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

标签: java oop coding-style


【解决方案1】:

当你不需要它们知道类状态来处理某些东西时,方法是静态的。辅助方法就是这种场景的好例子。

DateUtils.getDateNowInGMT()

上面的方法不需要任何状态给你答案。下面的那个。

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

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

【讨论】:

    【解决方案2】:

    一般来说,如果您使用大量静态方法,对您的代码进行单元测试会更加困难(人们认为使用类似 Mockito 的东西来模拟对象比使用类似 @987654322 的东西来模拟静态方法更容易@)。

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

    【讨论】:

      【解决方案3】:

      是的。

      这是正确的方法,至少我遵循了。

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

      但是,大多数未来的要求和更改需要,我们今天无法预见所有这些。所以实例应该优先于static。除非你遵循某种设计模式。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          静态元素,无论是变量还是方法,都会在类加载时加载到内存中,并一直保存到执行结束或类加载器卸载/重新加载它所属的类时。

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

          【讨论】:

            【解决方案6】:

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

            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.
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-11-09
              • 1970-01-01
              • 2014-05-12
              • 1970-01-01
              • 1970-01-01
              • 2011-01-13
              • 1970-01-01
              相关资源
              最近更新 更多