有一对执行相同任务的静态和实例方法?

tai*_*ion 6 java methods refactoring static instance

在开发二维矢量类作为数学库的一部分时,我正在考虑为风格和可用性原因设置静态和实例方法.也就是说,两个等效的函数,但一个是静态和非变异的,另一个是实例化和变异的.我知道我不是第一个考虑这个问题的人(例如,见这里),但我没有找到任何直接解决它的信息.

拥有静态和实例方法对的优点:

  • 有些人喜欢使用其中一种,在某些情况下可以选择使代码更容易阅读.
  • 暗示静态方法在提供静态和实例化方法时都不会发生变化.这可以使调用代码更清晰,例如:

    someVector = Vector2d.add(vec1, vec2);
    someVector = (new Vector2d(vec1)).add(vec2); // does the same thing although more convoluted.
    
    // similarly adding directly to a vector is simpler with a mutator method.
    someVector.add(vec2);
    someVector = Vector2d.add(someVector, vec2);
    
    Run Code Online (Sandbox Code Playgroud)

    当使用长链函数调用时,这一点尤其重要,这在向量中很常见.

  • 就地操作可以比为每个操作创建新实例更快地进行计算.用户决定性能何时重要.对于Vector类的用户,性能可能很重要,因为向量经常用于计算代价高昂的代码中.

仅具有静态或实例方法的优点,但不是两者:

  • 没有重要的代码冗余.更易于维护.

  • 减少膨胀.javadocs几乎是其大小的一半.

  • 没有必要通知用户静态方法永远不会变异,非getter实例化方法总是变异.

对静态/实例方法对感到不满?它是否在任何主要图书馆中使用?

模式"静态方法不变异,实例方法吗"广为人知?

Rob*_*Rob 3

我认为您提供静态/不可变和实例/可变方法的概念是一个很好的概念。我认为这种区别很容易解释,并且 API 用户也很容易理解和记住。

我认为你的API实现代码不会有多余的业务逻辑。您会发现,您重复了一种模式,其中静态实现创建一个新实例并在该新实例上调用实例方法。

鉴于我很懒,我会考虑构建一些基础设施,在编译时自动生成静态方法、它们的 javadoc 和单元测试。如果您有 10 个方法,这将是大材小用,但如果您有 1,000 个方法,这将是一个巨大的胜利。