Java 我试图理解它的意思是什么;编程到一个接口“;在爪哇

Java 我试图理解它的意思是什么;编程到一个接口“;在爪哇,java,data-structures,Java,Data Structures,我试图理解Java中“编程到接口”的含义由于客户需求的变化,我们是否应该对接口进行编程。这是唯一的原因吗 下面的程序将如何从客户和开发者的角度遇到问题 public interface SuperHeros { public List<String> getCharacters(); } public class DCSuperHeros implements SuperHeros { List<String> characters = List.of("

我试图理解Java中“编程到接口”的含义由于客户需求的变化,我们是否应该对接口进行编程。这是唯一的原因吗

下面的程序将如何从客户和开发者的角度遇到问题

public interface SuperHeros {
    public List<String> getCharacters();
}
public class DCSuperHeros implements SuperHeros {
    List<String> characters = List.of("Super Man", "Bat Man", "Wonder Woman", "Cyborg", "Flash");

    public List<String> getCharacters() {
        return characters;
    }
}
public class MarvelSuperHeros implements SuperHeros {
    List<String> characters = List.of("Spider Man", "Captain America", "Daredevil", "Wolverine", "Iron Man");

    public List<String> getCharacters() {
        return characters;
    }
}

**SuperHeros marvelHeros = new MarvelSuperHeros(); //Line 15
SuperHeros dcHeros = new DCSuperHeros(); //Line 16
公共接口超级英雄{
公共列表getCharacters();
}
公共类DCSuperHeros实现SuperHeros{
列表字符=列表(“超人”、“蝙蝠侠”、“神奇女侠”、“电子人”、“闪光”);
公共列表getCharacters(){
返回字符;
}
}
公共类超级英雄实现超级英雄{
列表字符=列表中的(“蜘蛛侠”、“美国队长”、“胆大包天”、“狼獾”、“铁人”);
公共列表getCharacters(){
返回字符;
}
}
**超级英雄惊奇英雄=新的超级英雄()//第15行
超级英雄dcHeros=新的DCSuperHeros()//第16行

第15行和第16行有什么问题。有人能用一个用例解释一下,这个用例会因为编码实现而导致这个示例出现问题吗?***

想象一下,您有一个CLI程序和服务器都使用的库。 该库使用的缓存只是键值对的映射

您希望库使用的接口是Map,因为对于CLI程序,您可能可以使用HashMap,但是对于服务器,您可能希望使用ConcurrentHashMap来实现线程安全。您使用的实现将在运行时注入。您甚至可能想要使用Redis实现

另一个类似的例子是管理数据存储库的库。您可能需要使用AWS或Azure存储的实现,以及使用MongoDB或SQL的实现。您可能希望该库向使用它的程序提供相同的接口,并在运行时选择所使用的实现

或者为了一些不那么无聊的事情,想象一下你正在编写《超级马里奥兄弟2》。有4个角色可供选择:马里奥、路易吉、桃子公主和蟾蜍。当您按下D-pad或A或B按钮时,每个按钮的行为略有不同,但它们都具有相同的界面

关于第15/16行

你可以有一个由两个网站使用的wiki系统,一个是DC,一个是marvel

两者都使用的类将接受接口

SuperHeros marvelHeros = new MarvelSuperHeros(); //Line 15
SuperHeros dcHeros = new DCSuperHeros(); //Line 16

SuperHeroDataBase marvelDataBase = new SuperHeroDataBase(marvelHeros);
// these aren't necessarily in the same program, could be 2 totally different server programs that use the same library
SuperHeroDataBase dcDataBase = new SuperHeroDataBase(dcDataBase);
使用超级英雄数据库的ctor:

public SuperHeroDataBase(SuperHeros superHeros){
    this.superHeros = superHeros);
}

上述程序的解决方案如下:公共接口超级英雄{public List getCharacters();静态超级英雄createDCSuperHeros(){return new DCSuperHeros();}静态超级英雄createMarvelSuperHeros(){return new MarvelSuperHeros();}超级英雄m=超级英雄。createMarvelSuperHeros();超级英雄d=SuperHeros.createdSuperheros();如果客户端程序必须获取MarvelSuperHeros或DCSuperheros的实例,那么=new MarvelSuperHeros或DCSuperheros有什么问题第15行和第16行没有问题。这两个变量都声明为接口,因此它们后面的代码将针对接口而不是实现进行编程。谢谢Mike。你说“遵循它们的将是针对接口而不是实现的编程”你能举个例子吗?嗨,谢谢你的解释。但如果你能用我的例子来解释,我会更容易。第15行和第16行有什么问题?是的,我不明白,第15行和第16行是在编程接口,但我想我会给出一个例子。不相关,但它是“用例”而不是“用例”a/a是基于声音的