需要设计/模式/结构帮助来编写java';世界';
我一直想用Java编写一个简单的世界,但我可以运行“世界”,然后在以后添加新对象(世界开始运行时不存在的对象)(以模拟/观察未来对象之间的不同行为) 问题是,我不想在世界启动后停止或重新启动它,我希望它能运行一周而不必重新编译,但能够插入对象并随时间重复/重写/删除/创建/修改它们 这个世界可以简单到一个10 x 10的x/y“位置”数组(想想棋盘),但我想需要某种定时过程来监控对象,并给每个对象(如果有的话)一个“行动”的机会(如果他们愿意的话) 示例:我在周一编写了需要设计/模式/结构帮助来编写java';世界';,java,Java,我一直想用Java编写一个简单的世界,但我可以运行“世界”,然后在以后添加新对象(世界开始运行时不存在的对象)(以模拟/观察未来对象之间的不同行为) 问题是,我不想在世界启动后停止或重新启动它,我希望它能运行一周而不必重新编译,但能够插入对象并随时间重复/重写/删除/创建/修改它们 这个世界可以简单到一个10 x 10的x/y“位置”数组(想想棋盘),但我想需要某种定时过程来监控对象,并给每个对象(如果有的话)一个“行动”的机会(如果他们愿意的话) 示例:我在周一编写了World.java,并让
World.java
,并让它继续运行。然后在周二,我编写了一个名为Rock.java
(不动)的新类。然后我将它(不知何故)放入这个已经运行的世界(它只是将它随机放入10x10阵列中的某个地方,并且从不移动)
然后在周三,我创建了一个名为Cat.java
的新类,并将其放入世界中,再次随机放置,但这个新对象可以在世界各地移动(在一段时间内),然后在周四,我编写了一个名为Dog.java
的类,该类也可以四处移动,但如果另一个对象位于相邻位置,则可以对其进行“操作”,反之亦然
事情是这样的。我不知道我需要什么样的结构/设计来编写实际的世界级代码,以了解如何检测/加载/跟踪未来的对象
那么,您对如何执行类似操作有什么想法吗?如果您只关心添加类(而不是修改),我会这样做:
- 有一个接口
,包含您需要的所有业务方法(实体
,insertIntoWorld()
,isMovable()
,getName()
等)getIcon()
- 实体驻留在一个特定的包中
- 应用程序中有一个计划作业,每30秒列出一次包的类文件
- 跟踪类,并针对任何新类尝试加载类并强制转换到
实体
- 对于任何新加载的
创建一个新实例并调用它的实体
insertIntoWorld()
世界中拥有一个UI控件,从中可以指定要加载的类名
一些问题:
- 您无法轻松更新
实体
。你很可能需要做一些类加载器魔术
- 您无法扩展
实体
界面来添加新的业务bethod,因此您必须遵守最初启动应用程序时使用的合同
我不知道这样的问题是否有一种模式/策略,但我会这样处理:
我会让您计划创建的所有这些不同的类都必须是某个公共类(可能是WorldObject类)的对象,然后将它们不同的特性放在单独的配置文件中
创建
当您的程序运行时,它会定期检查配置文件夹中的新项目。如果它看到存在一个新的配置文件(比如Cat.config),那么它将创建一个新的WorldObject对象,并为其提供从Cat.config文件读取的功能,然后将该新对象放入世界中
突变
如果您的程序检测到其中一个项目的配置文件已更改,则会在世界中找到该对象,编辑其功能,然后重新显示
删除
当程序在文件夹中查找并发现配置文件不再存在时,它将从世界中删除该对象,并检查其对所有其他对象的影响。解释太长,问题太简单。
换句话说,您只需要执行动态类加载
首先,如果您知道类名,可以使用class.forName()
加载它。这是获得类本身的方法。然后可以使用Class.newInstance()
实例化它。若你们的类有公共的默认构造函数,那个就足够了。有关更多详细信息,请阅读反射API
但是如何将新类的名称传递给已经运行的程序呢?
我建议两种方法
程序可以执行预定义文件的轮询。当您希望部署新类时,您必须注册它,即将其名称写入此文件。此外,该类必须在应用程序的类路径中可用
应用程序可以对(例如)包含jar文件的特殊目录执行轮询。一旦检测到新的jar文件,它就可以读取其内容(请参见JarInputStream
),然后使用ClaasLoader.defineClass()调用实例化新类,然后调用newInstane()等
我不会对JVM本身永远运行打赌太多。失败的方式太多了(计算机故障、未预期的内存不足、重复类加载导致的永久性问题)
相反,我将设计一个能够可靠地持久化每个相关对象状态的系统(最简单的方法:使每个对象可序列化,但这并不能真正解决版本控制问题)
因此,作为第一步,我只需实现一些漂亮的类加载器魔术,以允许JAR“丢弃”到将动态加载的世界模拟中。但是,一旦您达到了一个不再有效的点(因为您需要修改世界本身,或者需要对某些对象进行不兼容的更改),那么您就可以保持该状态,为新版本切换库并重新加载该状态
能够持久化状态还允许您使用不同的参数轻松生成测试场景或重播场景。看看OSGi-此框架允许