从外部类引用内部类实例

时间:2014-02-03 00:42:58

标签: java nested-class

我刚刚开始学习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;
        }
    }

}

2 个答案:

答案 0 :(得分:5)

必须在某处维护一个列表,否则这些内部类实例将被垃圾收集。是否在Bicycle成员的数组中或在某些外部数据结构中是一个设计决策,但是Java没有内部类实例保存的自动列表。

答案 1 :(得分:1)

是的,您需要维护一份清单。

此外,骑手似乎不应该是自行车的内部类。通过让Rider成为一个私人的内部阶级,你说它只对自行车有用。从概念上讲,内部类更多地用于自行车的某个子部分,该部分执行内部操作或保存组成并特定于该自行车的内部数据。我可以想象一个FlatTyreEventHandler是一个内部类,但我不认为Rider是内部结构或自行车操作的一部分。

现在,拥有一个骑手和内部类的自行车可能会在你的实例中起作用,但请记住,外界想要了解骑手的任何事情都必须通过自行车,所以你必须继续添加这样的方法作为GetRiderAge(),GetRiderRoutePreference()。这些方法特定于骑车者并且与自行车无关。如果你发现自己这样做,那么Rider实际上并不是一个内部隐藏的类,而是自行车上的方法只是对Rider方法的直通,而将它作为一个内部类只有很少的用途。此外,自行车已失去其单一目的(成为自行车)并且通过Rider界面臃肿。

所以,我可能会让Rider成为一个独立的班级,然后自行车有一个骑手列表。或者,你可以有一个单独的班级,这是BicycleRiders,这个班级可以举行从自行车到骑手的地图。