Java高级类中的访问方法 上下文
我正在用Java制作一个2D游戏 我有一个Java方案:Java高级类中的访问方法 上下文,java,Java,我正在用Java制作一个2D游戏 我有一个Java方案: | Map | ---- | BlockGrid | ---- | Block | 其中Map、BlockGrid和Block是Java类 这里,地图类有一个区块网格属性,区块网格类有一个区块[][]属性存储网格中的所有区块 我的目标 我希望能够从块类访问Map实例中的方法。 例如,我想在Map实例上调用spawnEntity(..)来生成箭头或其他东西 解决? 我曾考虑过创建spawneEntity(..)静态,但我知道这不是一个好做
| Map | ---- | BlockGrid | ---- | Block |
其中Map、BlockGrid和Block是Java类
这里,地图类有一个区块网格属性,区块网格类有一个区块[][]属性存储网格中的所有区块
我的目标
我希望能够从块类访问Map实例中的方法。
例如,我想在Map实例上调用spawnEntity(..)
来生成箭头或其他东西
解决?
我曾考虑过创建spawneEntity(..)
静态,但我知道这不是一个好做法,因为为了生成实体,需要实例化映射
我还考虑将我的映射实例作为参数传递到每个构造函数中。这样,BlockGrid和Block就可以访问实例,并能够调用方法
我的问题
这种情况下的最佳做法是什么?
谢谢。制作一个界面:
interface EntitySpawner {
void spawnEntity(...);
}
使您的Map
类实现此接口,然后使BlockGrid
接受EntitySpawner
作为参数
class Map implements EntitySpawner {
private final BlockGrid grid = new BlockGrid(this);
@Override
public void spawnEntity(..) {
// do something here
}
}
一般来说,一个好的做法是拥有一个不相关的组件。这意味着,如果您选择通过传递引用来使<>代码> map < /COD>类的方法适用于<代码> Bug < /Cord>类,则应该考虑通过接口实现这一点(参见OMAS应答)。通过这种方式,如果以后选择使用其他类的对象初始化
块
s,而不仅仅是映射
实例
但是,第二件事你应该问问自己,能够产生实体是否真的是块的责任?我会说不,因为块
可能只是一个位置加上一些结构的表示(尽管我不知道程序的语义)。通过选择不同的方法来构造程序,您可以避免引入(Map
依赖于Block
,Block
依赖于Map
),这通常被认为是一件非常糟糕的事情(除其他外,因为您的组件耦合度很高),并遵循(因为Block
s不再负责生成实体)
在我看来,您不应该允许从块
s访问Map
s,而是让Map
负责生成实体。一种方法是:
public final class Map {
private final BlockGrid blockGrid;
public Map(BlockGrid grid) {this.blockGrid = grid;}
public void spawnEntityAt(int x, int y) {
Block block = this.blockGrid.getBlockAt(x, y);
// spawn the entity using information from 'block'
}
}
final class BlockGrid {
private final Block[][] grid;
public BlockGrid(Block[][] grid) { this.grid = grid; }
public Block getBlockAt(int x, int y) {
return this.grid[x][y];
}
}
final class Block {}
在每个构造函数中传递map实例作为参数应该是最好的做法。但是我以前使用过这个方法,而且它的工作很好。传递引用应该在简单的情况下工作。如果你想进一步的话,你可以考虑实现。人们使用Gotos,也许他们也认为Goto工作得很好。你想要单B吗?est实践还是可行的实践?