2015-01-04 5 views
0

Следующий ниже класс представляет собой построитель контекста, который помещает объекты Tree в географическое пространство на сетке. Я создал список массива дерев объектов с различными значениями пригодности и идентификаторами:Где я могу поместить функцию геттера?

public class TreeBuilder implements ContextBuilder<Object> { 


@Override 
public Context build(Context<Object> context) { 
    context.setId("taylor"); 

    ContinuousSpaceFactory spaceFactory = 
    ContinuousSpaceFactoryFinder.createContinuousSpaceFactory(null); 
    ContinuousSpace<Object> space = 
    spaceFactory.createContinuousSpace("space", context, 
      new RandomCartesianAdder<Object>(), 
      new repast.simphony.space.continuous.WrapAroundBorders(), 
      50, 50); 


    GridFactory gridFactory = GridFactoryFinder.createGridFactory(null); 
    Grid<Object> grid = gridFactory.createGrid("grid", context, 
      new GridBuilderParameters<Object>(new WrapAroundBorders(), 
      new SimpleGridAdder<Object>(), 
      true, 50, 50)); 

    ArrayList<Tree> trees = new ArrayList<Tree>(); 

    int treeCount = 100; 
    for (int i = 1; i < treeCount; i++) { 
     double suitability = Math.random(); 
     int id = i; 


    Tree tree = new Tree(space, grid, suitability, id); 
    context.add(tree); 
    trees.add(tree); 



    tree.measureSuit(); 

    } 

    Tree maxTree = Collections.max(trees, new SuitComp()); 
    System.out.println(maxTree); 

    for (Object obj : context) { 
     NdPoint pt = space.getLocation(obj); 
     grid.moveTo(obj, (int)pt.getX(), (int)pt.getY()); 

    } 


    return context; 

} 


} 

я считаю, что я могу использовать поглотитель, чтобы получить доступ к списку других классов. Что-то вроде этого ...

public ArrayList<Tree> getList() { 
return trees; 
} 

Но мой вопрос: где я могу поставить код выше? Я получаю сообщение об ошибке, когда я его помещаю, в частности, с помощью «деревьев возврата».

Кроме того: Могу ли я использовать геттер, чтобы получить значение maxTree из списка?

+0

Обычно 'getters' используются для ** class ** (не локальных) переменных. –

ответ

3

Не в этом контексте.

Обычно используется геттер для доступа к полю; trees объявлен как локальная переменная в методе build. Это означает, что каждый раз, когда он вызывается, вы получаете новый список, и он больше не существует, как только вы вернулись из метода.

Если вы действительно хотите сохранить список деревьев (и я не знаю, почему вы хотите), вы должны переместить его в объявлении поля:

private List<Tree> trees = new ArrayList<>(); 

Аналогичная проблема существует с значение maxTree; если вы хотите сохранить это, и что делает, кажется, что-то разумное, чтобы сохранить ваш экземпляр, тогда вам придется переместить его и в поле. Это не так просто, как декларация выше, поскольку вы только знаете, что значение внутри этого метода, но его вызов не должен быть намного сложнее, чем он. Я оставляю это как упражнение для читателя.

+0

Можете ли вы расширить информацию о списках как объявление поля? Я уверен, что это то, что мне нужно. В моей симуляции мне нужен другой класс или агент, чтобы таргетировать деревья с наивысшей пригодностью. –

+0

http://stackoverflow.com/a/20671118/1079354 – Makoto

+0

благодарит за вашу помощь –

Смежные вопросы