java - 将私有(private)方法设为静态以增加函数式编程的习惯

标签 java oop static functional-programming static-methods

我接触了函数式编程范式(haskell、scala)并且喜欢这个概念。我正在尝试将这些功能原则融入到我的日常工作中。

这里是一个例子

public class Functional
{

  private final Object o1;
  private final Object o2;

  public Functional(Object o1, Object o2)
  {
    this.o1 = o1;
    this.o2 = o2;
  }

  /*
   * method has side effects 
   */
  private void method()
  {
    //    o1.someChange();
    //    ...
    //    o2.someChange();
  }

  /*
   * method has no side effects - it only uses its parameters
   */
  private static void method(Object o1, Object o2)
  {
    //    o1.someChange();
    //    ...
    //    o2.someChange();
  }

  public void work()
  {
    method(o1, o2);
  }

  public static void main(String[] args)
  {
    Functional f = new Functional(new Object(), new Object());
    f.work();
  }
}

我找到了static方法更容易维护,对于那些没有编写代码的人来说也是如此,因为他们只需要查看方法参数 - 这在大类中可能是一个优势。另一个小优点是性能,因为编译后 static方法通过 invokestatic 调用这稍微快一点。

public方法仍然保持静态,因为我不想放弃 OOP/封装。我只是在谈论 private static 方法。

<小时/>

问题

那么您对这种方法有何看法?特别是。我将所有私有(private)方法设为静态的新习惯有哪些负面影响 - 在合理范围内,只要我不需要超过 3、4 个参数?

最佳答案

恕我直言,您应该在以下情况下使用静态方法

  • 没有争论(罕见)
  • 无法扩展感兴趣的类别,例如您想为字符串添加一个方法。
  • 您想要向接口(interface)添加方法(Java 8 之前的版本)

否则,静态方法与隐式获取第一个参数的实例方法非常相似。也就是说,您可以简单地将一种转换为另一种。

考虑这些递归方法调用。

class Type {
    static ReturnType staticMethod(Type type, Object arg) {
         return type.method(arg);
    }

    ReturnType method(Object arg) {
         return staticMethod(this, arg);
    }
}

恕我直言,为了清楚起见,您应该尽可能使用实例方法,并将静态方法留给您别无选择的极少数情况。

注意:无论是否使用静态方法,都可以使用函数式编程。要记住的主要原则是 a) 始终将您创建/更改的内容作为返回值返回 b) 不要更改任何参数,包括实例方法的 this

这使您可以灵活地打破这一点;仅更改 this 而不是参数之一(并且仅在必须时才更改)

关于java - 将私有(private)方法设为静态以增加函数式编程的习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24886563/

相关文章:

c# - F# 缺少面向对象或命令式的什么?

C++ virtual = 0; 之间的区别和空函数

c# - 防止对象进入某种状态后被更改? (C#)

c++ - 如何初始化对类内部变量的静态引用,以用于嵌套类

objective-c - Objective-C中的静态构造函数等效?

python - 包括 SimpleHTTPServer?

java - Firebase SDK 9.0.0 纯 java 版本?

java - 计算普通数字实例的字节使用量

java - 列表过程中的无限循环

java - 如何在不将所有表单字段定义为类属性的情况下将对象从 JSP 表单传递到 Struts2 中的 Action 类?