2015-01-04 4 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; 

} 


} 

내가 다른 클래스의 목록에 액세스 할 게터를 사용할 수 있다고 생각 : 나는 나무의 배열리스트가 다양한 적합성 값과 ID를 가진 개체를 만들었습니다. 이게 뭔가 ...

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

하지만 내 질문은 위의 코드를 어디에 넣어야합니까? 나는 그것을 놓을 때마다, 특히 "돌아 오는 나무들"과 함께 오류가 발생합니다.

추가 정보 : getter를 사용하여 목록에서 maxTree 값을 가져올 수 있습니까?

+0

일반적으로'getters'는 ** class ** (지역 변수가 아님) 변수에 사용됩니다. –

답변

3

이 문맥에는 해당되지 않습니다.

일반적으로 필드에 액세스하는 데 getter가 사용됩니다. treesbuild 메서드에서 로컬 변수로 선언됩니다. 즉, 호출 될 때마다 새 목록을 얻고이 메서드에서 반환 된 후에는 더 이상 존재하지 않습니다.

당신은 정말 나무 목록을 저장하려면 (그리고 나는 당신이하고 싶은 이유를 모르겠어요), 당신은 필드 선언으로 이동해야합니다 :

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

유사한 문제가 존재 maxTree 값; 그걸 저장하고 싶다면 이 당신의 인스턴스를 유지하는데 합리적인 것처럼 보일 것입니다. 그렇다면 그것을 필드로 옮겨야 할 것입니다. 위의 선언과 같이 간단하지는 않습니다. 값이 그 메소드의 내부에 있는지만을 알기 때문에 호출은 복잡하지 않습니다. 나는 그것을 독자에게 연습으로 남겨 둡니다.

+0

리스트를 필드 선언으로 좀 더 확장 할 수 있습니까? 나는 그것이 내가해야 할 일이라고 확신한다. 시뮬레이션에서 가장 적합한 적합성을 목표로 다른 클래스 나 에이전트가 필요합니다. –

+0

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

+0

도움 주셔서 감사합니다. –