为什么用于创建谓词的函数应该定义为静态?

CKi*_*ing 1 predicate java-8

在阅读Java 8中引入的新功能的同时,我发现了Predicates的概念.我注意到互联网和书籍中提供的大多数示例都使用静态函数来创建谓词.

以下面的Apple类为例:

public class Apple {

    private String color;
    private int weight;

    private static final int SMALL_APPLE_MAX_WEIGHT = 150;

    public Apple(String color, int weight) {
        this.color = color;
        this.weight = weight;
    }

    public static boolean isGreenApple(Apple apple) {
        return null!=apple && null!=apple.getColor() && "green".equals(apple.getColor());
    }

    public boolean isBigApple() {
        return this.getWeight() > SMALL_APPLE_MAX_WEIGHT;
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在可以创建一个新的谓词如下:

Predicate<Apple> isGreenApple = Apple::isGreenApple;
Predicate<Apple> isBigApple = Apple::isBigApple;
Run Code Online (Sandbox Code Playgroud)

如上所示,我可以使用静态和实例方法创建谓词.哪种方法是首选方法,为什么?

Hol*_*ger 6

对于方法引用,实例方法A.foo()static方法之间没有区别foo(A),实际上,如果两者都存在,编译器将拒绝方法引用为模糊.

因此,决定是使用实例方法还是static方法不依赖于是否要通过方法引用为其创建函数的问题.

相反,你必须按照惯例应用相同的考虑因素.如果方法可以覆盖,它必须是一个实例方法,否则,如果它代表一个固定的算法,你可以考虑一个static方法,但当然,一个final方法也可以.

static当您不是要处理其实例的类的维护者时,换句话说,当包含类必须与实例的类不同时,这些方法显然是不可避免的.但即使类是相同的,但你觉得它也可以放在另一个(实用程序)类中,声明它static可能是更好的选择.

当有一个以上的参数,第一个是不是特殊的操作.这尤其是持有,比如max(Foo,Foo)应该是一个static方法,而不是一个实例方法max(Foo)Foo.

但最终有不同的编程风格,答案是方法引用不要求特定的编程风格.


关于为什么有这么多使用static方法的例子; 我不知道足够的例子来决定你的观察是正确的还是仅仅是主观观点.但也许一些教程编写者自己并不知道将实例方法作为一个函数将方法接收器作为第一个参数引用的可能性.

我想,有一些例子,比如

Predicate<String> empty=String::isEmpty;
Predicate<CharSequence> isHello="hello"::contentEquals;
Run Code Online (Sandbox Code Playgroud)

这些值得在教程中显示,以强调您不需要创建专门用作方法引用的方法,但实际上有很多已经存在的方法,static而且static不能直接用于方法引用.