Java 在这种情况下,我如何避免打字检查
情况如下:Java 在这种情况下,我如何避免打字检查,java,typechecking,Java,Typechecking,情况如下: 我们有一个有玩家和物品的游戏。当一个玩家在他们的库存中有所有3个特定的物品并组装它们(地图上每个物品只有一个)时,游戏就赢了。物品有一个非常简单的界面,玩家可以调用use()。还有其他实现项接口的类,这些类已从代码段中删除。如果我忽略了OOP的基本原则,我可以说,当玩家使用其中一个时,我们会迭代玩家的库存,并检查其中是否有所有3种特定类型的项目。我如何避免这样做 public interface Item{ public void use(); } public class
我们有一个有玩家和物品的游戏。当一个玩家在他们的库存中有所有3个特定的物品并组装它们(地图上每个物品只有一个)时,游戏就赢了。物品有一个非常简单的界面,玩家可以调用
use()
。还有其他实现项
接口的类,这些类已从代码段中删除。如果我忽略了OOP的基本原则,我可以说,当玩家使用其中一个时,我们会迭代玩家的库存,并检查其中是否有所有3种特定类型的项目。我如何避免这样做
public interface Item{
public void use();
}
public class SpecificItem1 implements Item{
public void use(){...}
}
public class SpecificItem2 implements Item{
public void use(){...}
}
public class SpecificItem3 implements Item{
public void use(){...}
}
public class Player{
ArrayList<Item> inventory;
public void didWeWin() {
int numOfSItems = 0;
for(Item i : inventory) {
if(i instanceOf SpecificItem1)
numOfSItems++;
if(i instanceOf SpecificItem2)
numOfSItems++;
if(i instanceOf SpecificItem3)
numOfSItems++;
}
if(numOfSItems == 3)
win();
}
}
公共接口项{
公共用途();
}
公共类SpecificItem1实现该项{
public void use(){…}
}
公共类SpecificItem2实现该项{
public void use(){…}
}
公共类SpecificItem3实现该项{
public void use(){…}
}
公开课选手{
ArrayList目录;
公共无效迪德温(){
int numOfSItems=0;
用于(项目一:存货){
如果(i SpecificItem1的实例)
numositems++;
如果(i SpecificItem2实例)
numositems++;
如果(我是SpecificItem3的实例)
numositems++;
}
如果(numOfSItems==3)
赢();
}
}
您可以使用getClass()
获取项目的类,然后计算唯一类的数量:
public void didWeWin() {
if (inventory.stream().map(Object::getClass).distinct().count() == 3L) {
win();
}
}
如果库存中可能包含不属于赢家条件的其他种类的物品,检查至少有三种不同种类的物品是不够的。在这种情况下,您可以使用该方法检查win条件所需的项目类
//在Java 9+中使用List.of works,在Java 8中使用Arrays.asList
私有静态列表您总是调用numOfSItems++
对于所有情况,如果
s全部删除,您只需删除。是否有其他类实现项
接口?如果没有,正如您所说的“地图上每一个都只有一个”,您可以只检查库存的大小
还有其他类实现项
接口。实际上,如果您仔细阅读问题,它会说“地图上每一个只有一个”—您可以只检查列表的大小。除非有其他类实现该接口,但问题中缺少该信息