gpt4 book ai didi

java - 面向对象 : Does container contain bike or chair?

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:59 24 4
gpt4 key购买 nike

一个容器可能包含属于一个人的自行车和椅子。我想检查一下容器中是否包含该人的自行车或椅子。如果不使用 instanceof 是否可行?

public class Container {

public Map<Person, List<Item>> items = new HashMap<>();

public void add(Person p, Item item) {
items.get(p).add(item);
}

public boolean containsChair(Person owner) {
for(Item i : items.get(owner)) {
if(i instanceof Chair) {
return true;
}
}
return false;
}

public boolean containsBike(Person owner) {
for(Item i : items.get(owner)) {
if(i instanceof Bike) {
return true;
}
}
return false;
}
}

为了便于说明,Item、Bike、Chair、Person 都是最简单的类 stub :

public class Person { public String name; }
public abstract class Item {}
public class Bike extends Item { public Wheel[] wheels;}
public class Chair extends Item { public Leg[] legs;}
public class Wheel {}
public class Leg {}

在运行者中,一个人应该能够将椅子和自行车添加到它的容器中:

import java.util.ArrayList;

public class Runner {
public static void main(String[] args) {
Container c = new Container();
Person p = new Person();

// Prevent null pointer exception
c.items.put(p, new ArrayList<>());

c.add(p, new Chair());

// True
System.out.println(c.containsChair(p));
}
}

最佳答案

您可以向类 Item 添加一个抽象方法 ItemType getType()ItemType 将是枚举所有可能的项目类型的枚举。

public abstract class Item {
public abstract ItemType getType();
}

public enum ItemType {
BIKE, CHAIR;
}

主席的实现:

public static class Chair extends Item {
public Leg[] legs;
@Override
public ItemType getType() {
return ItemType.CHAIR;
}
}

然后您可以定义一个 contains 方法来搜索给定的 Person,如果它有一个带有特定 ItemType 的项目:

public boolean contains(Person owner, ItemType itemType) {
return items.get(owner).stream().anyMatch(item ->itemType.equals(item.getType()));
}

或者关于 owneritems 列表的 null 安全:

public boolean contains(Person owner, ItemType itemType) {
return Optional.ofNullable(items.get(owner))
.map(i -> i.stream().anyMatch(item -> itemType.equals(item.getType())))
.orElse(false);
}

用法:

public static void main(String[] args) {
Container c = new Container();
Person p = new Person();

// Prevent null pointer exception
c.items.put(p, new ArrayList<>());

c.add(p, new Chair());

// True
System.out.println(c.contains(p, ItemType.CHAIR));
}

编辑
按照这种方法,不需要 instanceof 检查。 instanceof 的用法可以是指示 that the design has some flaws 的提示.

关于java - 面向对象 : Does container contain bike or chair?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52714029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com