Better ChildFactory

http://blogs.oracle.com/geertjan/entry/better_childfactory

————————————————————————————————————————————————————————————————————————

Thanks to Jesse, here's a corrected & improved ChildFactory from a few days ago, using ChildFactory.Detachable so that you have addNotify/removeNotify to add/remove the LookupListener and thus avoid a memory leak, together with a createKeys/resultChanged that is simplified too.
private class FirstLevelChildFactory extends ChildFactory.Detachable<ResultType> implements LookupListener {

    Result<ResultSet> resultRetrievedFromYahoo;

    @Override
    protected void addNotify() {
        resultRetrievedFromYahoo = Utilities.actionsGlobalContext().lookupResult(ResultSet.class);
        resultRetrievedFromYahoo.addLookupListener(this);
    }

    @Override
    protected void removeNotify() {
        resultRetrievedFromYahoo.removeLookupListener(this);
        resultRetrievedFromYahoo = null;
    }

    @Override
    protected boolean createKeys(List<ResultType> list) {
        for (ResultSet rs : resultRetrievedFromYahoo.allInstances()) {
            list.addAll(rs.getResult());
        }
        return true;
    }

    @Override
    protected Node createNodeForKey(ResultType key) {
        String[] split = key.getTitle().split(" ");
        String theNextWordToBeSearched = split[split.length - 1];
        AbstractNode firstLevelNode =
                new AbstractNode(
                Children.create(new GenericChildFactory(theNextWordToBeSearched), true),
                Lookups.singleton(key));
        firstLevelNode.setShortDescription(key.getSummary());
        firstLevelNode.setDisplayName(key.getTitle());
        return firstLevelNode;
    }

    @Override
    public void resultChanged(LookupEvent le) {
        refresh(true);
    }

}
This is a very simple & elegant solution.

原文地址:https://www.cnblogs.com/cuizhf/p/2189950.html