我应该把 getter 函数放在哪里?
Where do I put my getter function?
下面的 class 是一个上下文构建器,它将地理 space 中的 Tree 对象放置在网格上。我创建了一个包含各种适宜性值和 ID 的树对象数组列表:
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;
}
}
我相信我可以使用 getter 访问其他 classes 中的列表。像这样的……
public ArrayList<Tree> getList() {
return trees;
}
但我的问题是:我把上面的代码放在哪里?每当我放置它时都会出错,特别是 "return trees;"。
此外:我还可以使用 getter 从列表中获取 maxTree 值吗?
不在此上下文中。
一般使用getter访问字段; trees
在方法 build
中声明为局部变量。这意味着每次调用它时,您都会得到一个新列表,一旦您从该方法返回,它就不再存在。
如果你真的想存储树列表(我不确定你为什么想要),你必须将它移动到一个字段声明中:
private List<Tree> trees = new ArrayList<>();
maxTree
值也存在类似的问题;如果你想存储它,并且 does 看起来像是与你的实例保持一致的东西,那么你也必须将它移动到一个字段中。它不像上面的声明那么简单,因为您只知道该方法内部的值是什么,但它的调用不应该比它复杂得多。我把它留给 reader.
作为练习
下面的 class 是一个上下文构建器,它将地理 space 中的 Tree 对象放置在网格上。我创建了一个包含各种适宜性值和 ID 的树对象数组列表:
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;
}
}
我相信我可以使用 getter 访问其他 classes 中的列表。像这样的……
public ArrayList<Tree> getList() {
return trees;
}
但我的问题是:我把上面的代码放在哪里?每当我放置它时都会出错,特别是 "return trees;"。
此外:我还可以使用 getter 从列表中获取 maxTree 值吗?
不在此上下文中。
一般使用getter访问字段; trees
在方法 build
中声明为局部变量。这意味着每次调用它时,您都会得到一个新列表,一旦您从该方法返回,它就不再存在。
如果你真的想存储树列表(我不确定你为什么想要),你必须将它移动到一个字段声明中:
private List<Tree> trees = new ArrayList<>();
maxTree
值也存在类似的问题;如果你想存储它,并且 does 看起来像是与你的实例保持一致的东西,那么你也必须将它移动到一个字段中。它不像上面的声明那么简单,因为您只知道该方法内部的值是什么,但它的调用不应该比它复杂得多。我把它留给 reader.