在实现与公共接口中使用接口类型

时间:2013-12-04 03:54:57

标签: java oop interface

是否有必要在实现中使用接口类型,还是只将它们用作类或接口的公共接口的一部分?

示例(Java):

public class SomeClass {
    // Declare list as..
    private List<Object> list = new ArrayList<Object>();

    // or...
    private ArrayList<Object> list = new ArrayList<Object>();

    // Does it matter which way list is declared if it's part
    // of the private implementation?

    // This parameter should be the most general interface type
    // allowed because it's public-facing.
    public void someMethod(List<Object> list) {
        // ...
    }
}

1 个答案:

答案 0 :(得分:3)

通过将它们定义为尽可能抽象,您隐藏了实现细节。如果您希望使用List<T>中的其他子类而不是ArrayList<T>,那么您可以在不破坏任何代码的情况下这样做。

尽管仍然拥有您需要的方法,但始终尽可能抽象。这样你的实现就会尽可能灵活。

例如,我是一个有宠物的人。现在我有一只猫,但是如果我去非洲度假并碰巧看到一只非常棒的大象呢?我的猫会饿死,因为没有人给她食物,我会把大象放回口袋里回比利时。如果我将它定义为猫,我将不得不改变我的整个班级。相反,我将其定义为动物。

public class Person {
    String name;
    Animal pet;
    // Getters & Setters + Constructor
}

public abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Cat extends Animal {
    public Cat() { super("Cat")); }
}

public class Elephant extends Animal {
    public Elephant() { super("Elephant")); }
}

public class Lion extends Animal {
    public Lion() { super("Lion")); }
}

所以当我创建一个新人时:

Person bestPersonInTheWorld = new Person();
bestPersonInTheWorld.setName("Jeroen");
bestPersonInTheWorld.setPet(new Cat());

我可以简单地杀死猫

bestPersonInTheWorld.dontFeedForTwoWeeks();

我把我的大象放在院子里:

bestPersonInTheWorld.setPet(new Elephant());

在实施方面没有必要改变。