我刚刚开始学习Java教程,我决定花一些时间玩嵌套类。
我制作的工作副本是一个Bicycle类,其中可以包含零个或多个Rider类实例。在Bicycle的一个实例中,我希望能够与Riders的实例一起工作。
在下面的示例中,我的Bicycle有一个ArrayList来保存其Riders,但我想避免在可能的情况下维护此列表。
我的问题是这个。有没有其他方法可以引用骑自行车的Rider实例,还是我必须保留自己的列表?
//Outer Class contains zero or more Inner Classes
public class Bicycle {
//ArrayList of Inner Class instances
private List<Rider> Riders = new ArrayList<Rider>();
class Rider {
private String riderName;
protected Rider(String newRiderName) {
this.riderName = newRiderName;
}
protected String GetRiderName(){
return riderName;
}
}
//When creating an Outer Class, we can instantiate zero or more Inner Classes, by name
public Bicycle(String... startingRiderName) {
//Loop through all Inner Class instance names and create an Inner Class for each
for (String newRiderName : startingRiderName) {
Riders.add(new Rider(newRiderName));
}
}
//Public method to return an array of Inner Class instance names
public String[] GetRiderNames() {
String[] riderNames = new String[Riders.size()];
// Just in case we mess up and ask the ArrayList for an out of bounds index
try {
for (int riderIndex = 0; riderIndex < Riders.size(); riderIndex++) {
riderNames[riderIndex] = Riders.get(riderIndex).GetRiderName();
}
return riderNames;
} catch (IndexOutOfBoundsException e) {
return null;
}
}
}
答案 0 :(得分:5)
必须在某处维护一个列表,否则这些内部类实例将被垃圾收集。是否在Bicycle
成员的数组中或在某些外部数据结构中是一个设计决策,但是Java没有内部类实例保存的自动列表。
答案 1 :(得分:1)
是的,您需要维护一份清单。
此外,骑手似乎不应该是自行车的内部类。通过让Rider成为一个私人的内部阶级,你说它只对自行车有用。从概念上讲,内部类更多地用于自行车的某个子部分,该部分执行内部操作或保存组成并特定于该自行车的内部数据。我可以想象一个FlatTyreEventHandler是一个内部类,但我不认为Rider是内部结构或自行车操作的一部分。
现在,拥有一个骑手和内部类的自行车可能会在你的实例中起作用,但请记住,外界想要了解骑手的任何事情都必须通过自行车,所以你必须继续添加这样的方法作为GetRiderAge(),GetRiderRoutePreference()。这些方法特定于骑车者并且与自行车无关。如果你发现自己这样做,那么Rider实际上并不是一个内部隐藏的类,而是自行车上的方法只是对Rider方法的直通,而将它作为一个内部类只有很少的用途。此外,自行车已失去其单一目的(成为自行车)并且通过Rider界面臃肿。
所以,我可能会让Rider成为一个独立的班级,然后自行车有一个骑手列表。或者,你可以有一个单独的班级,这是BicycleRiders,这个班级可以举行从自行车到骑手的地图。