Java Iterables建模:路由impl Iterable <stations>或route.stations()?

时间:2016-08-12 08:48:41

标签: java collections iterator domain-driven-design

我的域中有RouteStation个类。路线描述了车辆通过序列站和行程元数据(操作员,公交车等)所采取的行程。

因此,Route将有一个站点列表和一些其他元数据。此列表的某些辅助方法也有必要,例如firstStation()和lastStation(),这里有2个选项:

在路线类中实施它们:

public class Route implements Iterable<Station> {

    // metadata

    private List<Station> stations;

    public Station firstStation() {
        return stations.get(0);
    }

    public Station lastStation() {
        return stations.get(stations.size() - 1);
    }

    @Override
    public Iterator<Station> iterator() {
        return stations.iterator();
    }


    // ...
}

唯一让我担心的是路由提供了 Station 迭代器,对开发人员来说可能不是很明显,特别是在这种情况下:

for (Station st : route)

但对于第一个/最后一个方法看起来很自然:

Station st = route.firstStation();

另一个想法是创建自定义集合实现:

public class Stations implements Iterable<Station> {
    private List<Station> stations;

    public Stations(List<Station> stations) {
        this.stations = stations;
    }

    public Station lastStation() {
        return stations.get(stations.size() - 1);
    }

    public Station firstStation() {
        return stations.get(0);
    }

    @Override
    public Iterator<Station> iterator() {
        return stations.iterator();
    }
}

public class Routte {
    private Iterable<Station> stations = new Stations();

    public Iterable<Station> stations() {
        return stations;
    }
}

所以这段代码更有意义:

for (Station st : route.stations())

这种方法更加冗长,需要一些技巧才能创建JPA映射。

这个问题与您的个人偏好有关,我很乐意听取您对如何在您的意见中实施上述代码的建议和想法(及其原因)。

1 个答案:

答案 0 :(得分:2)

由于您的自定义方法似乎在&#34; Route&#34;我会去

public class Route {
    private List<Station> stations;

    public Station firstStation() {
        return stations.get(0);
    }

    public Station lastStation() {
        return stations.get(stations.size() - 1);
    }

    public Iterable<Station> getStations() {
        return stations;
    }

    private static class Station {

    }
}

这允许您向Route添加自定义方法并且仍然具有

for (Station st : route.getStations())