Java:具有静态方法的类的集合——如果静态接口(interface)方法不是方法,还有其他方法吗?

标签 java static

在 Java 中,是否有一种设计模式或技巧可以处理“我希望在接口(interface)中声明静态方法,以便我的类被迫实现它们”?我最近读了很多关于接口(interface)中的静态类的文章,但没有什么能满足这个特定的问题。

例子:
假设我正在制作一款游戏,我们称之为 StarClone。我有一个保存文件,其中列出了士兵和野兽的最后已知位置。假设其中一个野兽是一个叫做 Zerkling 的单位。我的游戏 AI 很想知道它的部队中有多少 Zerkling,因为如果这个数字超过某个阈值,它将在玩家的基地执行“Zerk rush”攻击。对于此示例,该值存储为静态整数,该整数是 Zerkling 类的成员。

现在,我真的很想强制执行这样一个事实,即每个单元的类都有一个方法 countsHowMany,它获取这个保存文件并查看该特定单元存在多少——至少这是它可以做的,但是每个类都会实现这个但是它想要。由于成员变量是静态的,因此设置它的方法也是静态的似乎是明智的。我可能没有一个 Zerkling 实例,我可以在该实例上调用非静态 countsHowMany 方法,因为计数为 0 是可能的。我们可以争辩说,变量可能一开始就被初始化为 0,但想想初始值不能以相同方式使用的情况;例如在我的实际项目中,我正在检索游戏 Sprite 图像;这些开始为空。

将我所有的士兵和野兽类的列表简单地放在一个位置,通过一个我们可以称为 ICountMyself 的接口(interface)分组到一个集合中,这似乎是一种理想的高效设计。所以我们可以这样做:

for ( Class <? extends ICountMyself> currentClass : listOfUnitClasses )
{
    currentClass.countHowMany( savedGameFile );
} 

但是当然,接口(interface)中的静态方法目前在 Java 中并不像这样工作。

可能解决此问题的一种可能性是让方法 countsHowMany 是非静态的。然后,当我遍历类时,我可以创建该类的新实例,调用其各自的 countsHowMany 方法,然后非静态方法将依次修改静态成员变量。这似乎有点浪费;想象一下,如果我必须以这种方式修改一本食谱,以便在食谱中使用不同量的盐。我会被强制翻阅每一页,找到每一个盐的入口,煮这道菜,划掉数量并写一个新的,最后把没吃的食物扔进垃圾桶。

我还有其他方法可以解决这个问题吗?

提前致谢!

编辑:感谢所有人的迅速而有见地的回答!我想起了这样一个事实,即对计算机科学中任何问题的有效答案是“嗯,这取决于……”我原本不希望如此具体以至于我的问题失去了普遍适用性,但请允许我详细说明一下原来的问题。

正如我简要提到的,最初的问题是处理正在加载的图像 Sprite 。这些图像是由我放入 jar 中的图像管理器包预先加载的(出于性能原因),希望有足够通用的东西在游戏之间重复使用。

为了坚持更面向对象的方法,游戏逻辑将绘制单元的责任委托(delegate)给对象本身。基本单元类负责实现 drawsToScreen 接口(interface)方法。反过来,基本单元类调用抽象方法 getSprite(),该方法由具体类实现。我相信每个对象都知道自己的状态,因此它可以确定从这个调用返回哪个 Sprite 帧。

剩下的就是从图像管理器中获取正确的图像引用,这就是为什么我很好奇如何使用静态方法以这种方式设置静态成员变量。这样就省去了每次我想找到我想要的图像时都在图像哈希表中寻找的麻烦。理想情况下,Zerkling 甚至在我实例化一个图像之前就知道使用什么图像将自己绘制到屏幕上。

最佳答案

我认为您不希望在 Zerkling 中使用此内容类(class)。 Zerkling 类的对象代表一个单位,但听起来您可能想要一个代表某种类型单位的整个组的对象(组大小可能为 0),每种类型的单位都有一个这样的对象。 countHowMany()方法将是为您的“组”类定义的实例方法。您可以使用 countHowMany() 定义接口(interface)或抽象类。方法,其他每个类 GroupOfZerklings等,会延长。

这不是唯一的解决方案。如果您只想对每种类型的单元进行计数,Map<Class,Integer>可能会完成这项工作。关键是 Zerkling.class管他呢。但是“组对象”是一种可能的解决方案;它是否是最佳解决方案取决于您在应用程序的其余部分中的需求。

关于Java:具有静态方法的类的集合——如果静态接口(interface)方法不是方法,还有其他方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807630/

相关文章:

static - 使用 2 个网络服务器(静态/动态)对网站来说是否是一种过度杀伤力?

c++ - 弃用 static 关键字...不再?

java - 使用 Java 反射更改私有(private)静态最终字段

java - Json/Jackson 命名约定

java - [持久性异常 : Error getting sequence nextval]

java - 如何将大型 XML 文件转换为 stream-like-java 8 对象

mfc - 将工具提示添加到 CStatic

java - EventBus 对象的方法在 java 中不起作用

java - 对于返回类型 -ClassCastException,将字符串转换为 Date 错误

c# - 返回从未使用过的对象的构造函数是否浪费?