Java SE 8新特性 - 静态方法

阅读:137
上节我们大致对接口进行了概述,接口是对行为的抽象。在Java SE 8之前,接口是不能有任何实现的方法,只能定义一个规范。Java SE 8之后,可以在接口定义静态方法。这个其实是和Sun设计接口的初衷是违背的。

那么为什么在Java SE 8中加入此新特性呢?

如果你细心观察,Java中有很多工具类,比如java.util.Collections、java.util.stream.FindOps、java.util.Objects、java.nio.file.Paths等等,这些都是十分实用的工具类,一般是类名以s结尾,通常我们叫做伴随类。他们有如下特性:

  1. 类名以s结尾。
  2. 类中很多静态方法,供其他类实用。

在实际的项目开发中,我们可以自己设计一些工具类。比如我们做一个搜索的模块,假如用于实现搜索的类名为Search,那么我们可以设计一个Searchs,用于辅助Search类,或者模块中的其他的类。

现在Java SE 8有了接口可以实现静态方法,我们就可以不用伴随类了,直接在接口中定义静态方法,实现一些十分实用的功能。

现在我们以java.util.Collections为例,把Collections中的一个静态方法,在接口Collection中实现,代码如下:

package net.zhifou.base;

import java.util.*;

public interface StaticFunction {

    public static final int REVERSE_THRESHOLD = 18;

    public static void reverse(List<?> list) {
        int size = list.size();
        if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
            for (int i = 0, mid = size >> 1, j = size - 1; i < mid; i++, j--)
                swap(list, i, j);
        } else {
            // instead of using a raw type here, it's possible to capture
            // the wildcard but it will require a call to a supplementary
            // private method
            ListIterator fwd = list.listIterator();
            ListIterator rev = list.listIterator(size);
            for (int i = 0, mid = list.size() >> 1; i < mid; i++) {
                Object tmp = fwd.next();
                fwd.set(rev.previous());
                rev.set(tmp);
            }
        }
    }

    public static void swap(List<?> list, int i, int j) {
        // instead of using a raw type here, it's possible to capture
        // the wildcard but it will require a call to a supplementary
        // private method
        final List l = list;
        l.set(i, l.set(j, l.get(i)));
    }
}

不过,虽然Java SE 8支持了接口中可以定义静态方法,但是JDK这块不太可能进行代码重构,毕竟代价太大了。

读后有收获,请打赏。更多精彩内容,请关注微信公众号。有疑问请加QQ交流群:454792501

全部评论

发表评论
更多精彩内容,请关注微信公众号