私有接口或抽象类:我的选择是什么

时间:2010-03-03 15:27:26

标签: java

所以这是我的问题:

我在项目中使用了许多接口来帮助维护良好的编码风格,但是,我的软件设计表明我可以将其导出为我和其他人可以使用的库。

问题在于可访问性。在我的一些接口中,我不希望其他人访问这些方法,但Java强制它们是公开的。这在我自己的项目中没问题,但我不希望其他人能够访问这些方法。

例如,我有一个名为Sprite的接口,其中包含以下一些方法

Sprite:
void update(Room room);
void draw(Room world, Canvas c);
void updateHealth();
void updateLocation(Room room);
int getLayer();
void shoot();
void setDirection(Direction direction);
...

这很好,因为所有精灵都需要这些方法,但其中一些如draw()我只想让我的游戏引擎使用。

我有什么选择?

4 个答案:

答案 0 :(得分:4)

我想说,缩小Spirte的界面并将您想要成为private的方法移动到AbstractSprite子类。这是最简单的方法。

答案 1 :(得分:0)

如果出现以下情况,抽象类应该没有问题:

  • 可以有一些常见的实现(即使它是一个非常简单的实现,如几个属性)
  • 您必须定义受保护的方法
  • 和你的东西是同类的对象(is-a relationship)。你说的是“我所有的精灵”,所以你说:“所有都是某种子类型的精灵”。

所以......在你的情况下,似乎抽象类很适合。

不要害怕。如果您需要接口,您也可以稍后定义它们(甚至抽象类实现具有方法子集的接口)。

或者,如果您需要更改,您可以重构。

答案 2 :(得分:0)

如何创建(或多个)Facade

如果你的库中有更多的类/接口在一起播放,那么Facade可以为外界提供一个受控的“界面”。更具体地说,对于您的Sprite,您可以将界面划分为两个界面:一个通过Facade可供外界使用,但不包括draw()之类的界面。对于您的内部使用,类似于DrawableSprite。那么你的内部对象当然会实现这两个接口。

答案 3 :(得分:0)

Java允许4级访问私有,受保护,公共和默认。 (默认是没有关键字)Nutshell中的Java调用它默认Sun java tutorial也说包私有

默认允许从同一个包中的类进行访问。

因此,在这种情况下,只有您应该访问的界面才是默认的,因此无法从包外看到。

对于Sprite,您需要拆分为2个接口 包含外部代码可以使用的公共Sprite。 仅限游戏引擎的默认值

您为Game Engine使用的对象可以扩展两个接口,