Java周二生效! 优先于抽象类的接口

面向对象编程的超级能力之一是具有相同类型的多个实现的能力。 这可以允许更强大的用法的更干净的代码。 Java提供了两种主要机制来完成此任务介面和抽象 classes. The main difference between the two is that in order to extend an 抽象 class, an implementing class must become a subclass of that 抽象 class. In order to implement an interface, an implementing class merely has to meet the general contract of the class.

接口的优点是什么:

  • Interfaces can be added after the fact. 类层次结构是事实之后要更改的相当沉重且僵化的东西,而接口可以非常简单地添加并且不会更改现有类的语义。Interfaces allow for 混入 like behavior.一种混入是除类的主要用途之外的附加行为。 例如,可比 is an example of a 混入. While it defines that the object has certain behavior, it doesn't take away from the root type of the object.Interfaces allow shared behavior without relying on hierarchies类迫使我们使用扩展来添加行为。 这就要求我们建立一个层次结构来实现这一点。 虽然通过层次结构组织我们的课程可能是适当且有用的,但在很多情况下,这并不是表达这一观点的最有效方法。

有效的Java然后进入一种有趣的模式,在这种模式下,我们可以充分利用接口和抽象类。 这个想法是将实现的所有部分推到尽可能低的层次,同时仍提供代码帮助者的用户来帮助他们。 您可以直接在界面中放很多东西,例如方法签名和默认方法。 但是,有些事情我们将无法在界面中提供。 例如,成员变量或非公共静态成员。 那么在这些情况下我们该怎么办? 我们刚刚讨论了应该如何选择接口,但是我们可能会感到,尤其是接口相当复杂或复杂(请考虑清单接口),我们应该为实现者提供一个开始的位置,或者每个实现都需要或需要的共享功能不适合接口的允许元素。

这是哪里骨架实现是一个有用的结构。一种骨架实现让我们两全其美。实际上,它只是一个抽象类,它实现一个接口,然后实现一个接口的非基本方法。通过这样做,我们可以将大部分工作都花在实现接口上。您经常可以认出这些骨架实现在野外,因为它们经常遵循相同的命名约定,Abstract哪里是该类为其提供骨架接口的接口的名称。例如,抽象馆藏,抽象集,etc。Whenthispatternisdonecorrectlyitcanmakeittrivialtoimplementaninterface。Forexamplelet'sseehowtoimplementa清单在。。。的帮助下Abstract清单骨架实现。

static List<Integer> intArrayAsList(int[] array) {
  return new AbstractList<Integer> {
    @Override
    public Integer get(int i) {
      return array[i];
    }

    @Override
    public Integer set(int i) {
      int oldValue = array[i];
      array[i] = i;
      return oldValue;
    }

    @Override
    public int size() {
      return array.length;
    }
  };
}

就是这样,清单在这三个简短的覆盖函数中。 当您想到一切时,这真是太神奇了清单为我们做。 这样做的好处是没有人被迫使用骨架实现,如果有人想从头开始并实现他们可以自由使用的界面,那么人们所依赖的就是界面,而不是骨架实现。 最后,正如我们在上一章的回顾中了解到的那样,我们应确保记录这些内容。骨架实现s以及它们是为继承而实现的。

总之,接口通常是定义共享类型的方法,当您创建非平凡的接口时,应考虑创建一个骨架实现界面的功能,以帮助未来课程的创建者。

from: https://dev.to//kylec32/effective-java-tuesday-prefer-interfaces-to-abstract-classes-21cn

你可能感兴趣的:(Java周二生效! 优先于抽象类的接口)