【问题标题】:When to make a method static? [closed]何时将方法设为静态? [关闭]
【发布时间】:2010-04-26 13:05:05
【问题描述】:

我想知道人们是如何决定是否将方法定义为静态的。我知道如果方法不需要访问实例字段,则只能将其定义为静态方法。所以假设我们有一个不访问实例字段的方法,你总是将这样的方法定义为静态的,还是仅当你需要静态调用它时(不引用实例)。

也许问同样问题的另一种方式是您是否使用静态或非静态作为默认值?

【问题讨论】:

标签: language-agnostic oop static-methods


【解决方案1】:

我尽可能使用静态方法。优点:

  • 从实例方法内部调用静态方法时,您可以确保对当前对象的状态没有副作用。
  • 在静态方法内部,您可以确保不会意外修改对象实例的任何状态。
  • 您可以从类外部使用静态方法,而无需构造实例。如果可以将方法设为静态,那么它显然不需要实例,因此不需要实例。
  • 静态方法的效率可能稍高一些,因为不需要传递“this”指针,也不需要动态分派。

【讨论】:

    【解决方案2】:

    Kevin Bourrillion 不久前就这个话题写了an insightful answer(诚然,从 Java 的角度来看,但我认为它也适用于其他语言)。

    他认为你应该基本上纯函数使用静态方法。

    pure function”是不修改任何状态且其 结果取决于 提供给它的参数。因此对于 例如,任何执行的功能 I/O(直接或间接)不是 纯函数,但 Math.sqrt() 的 当然是。

    我倾向于同意。 (尽管在我自己的代码中,传统上,我可能到处都使用了太多的静态辅助方法...... :-P 这肯定会使使用这些方法的代码更难测试。)

    【讨论】:

      【解决方案3】:

      如果方法的作用仅取决于其参数,则可以将其设为静态。如果该方法没有实例化任何其他用户定义的类,则可以将其设为静态。不过,默认设置是非静态的。

      【讨论】:

        【解决方案4】:

        当您执行不对类实例进行操作的操作时,请使用静态方法。

        一个完美的例子是Math 类的sqrt 方法。

        【讨论】:

        • 实用功能通常也是静态的。很好的答案。
        • 这个答案很糟糕,因为除了通过重复静态类方法的最基本定义来说明显而易见的事情之外,它没有给出任何理由。
        【解决方案5】:

        这取决于。在可以使用非成员函数的语言中,我会说大多数情况下,如果 可以 将方法设为静态,则应改为将其设为非成员函数,如果可能则设为非友元.你可以看出我的背景主要是 C++。

        在不可能使用非成员函数的“纯”OO 语言中,这将取决于该方法是“偶然”是静态的(即它只是碰巧不需要访问实例成员),还是在逻辑上真正是静态的 -它是整个类的方法,而不是特定实例的方法。

        【讨论】:

          【解决方案6】:

          默认情况下是非静态的,当我需要从至少两个不同的类中获得功能时是静态的,并且我不想浪费构造函数。

          ps。阿基米德规则!

          【讨论】:

            【解决方案7】:

            (C#) 默认情况下,我在静态类中使用静态方法,在非静态类中使用非静态方法。

            当我细化一门课程时,我发现自己自然而然地集中在使其完全静态或完全非静态。实际上,如果我开始想在非静态类中定义静态成员,我经常发现将它们分解成一个单独的静态类最终是最有意义的——无论是像 Math 这样的实用程序类还是全局应用程序类(如 .NET 的 ConfigurationManager)。

            从面向对象的角度来看,方法是对/与对象做某事。因此,如果您使用的是实例化对象,对我来说最有意义的是将该对象的方法视为非静态的。从技术上讲,如果非静态类不需要访问实例,则从技术上讲,您可以使它们具有静态成员。但至少从表面上看,一个类的方法仍然会为/与该类一些事情,所以我仍然会让它们成为非静态的。一切都是平等的,也就是说。

            【讨论】:

              【解决方案8】:

              在 python 的上下文中- staticmethod 基本上是一个正常的功能,我们保留在课堂上只是因为一些逻辑上的原因。 classmethod'class' 作为第一个参数,默认方法将instance aka self 作为第一个参数,但staticmethod 不接受任何参数。

              【讨论】:

                猜你喜欢
                • 2010-12-09
                • 2012-12-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多