Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java高级类中的访问方法 上下文_Java - Fatal编程技术网

Java高级类中的访问方法 上下文

Java高级类中的访问方法 上下文,java,Java,我正在用Java制作一个2D游戏 我有一个Java方案: | Map | ---- | BlockGrid | ---- | Block | 其中Map、BlockGrid和Block是Java类 这里,地图类有一个区块网格属性,区块网格类有一个区块[][]属性存储网格中的所有区块 我的目标 我希望能够从块类访问Map实例中的方法。 例如,我想在Map实例上调用spawnEntity(..)来生成箭头或其他东西 解决? 我曾考虑过创建spawneEntity(..)静态,但我知道这不是一个好做

我正在用Java制作一个2D游戏

我有一个Java方案:

| 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实践还是可行的实践?