Java 我在对象之间发送数据的方法有哪些缺陷?
我正在设计一个游戏项目的布局,并为“抽象游戏世界”的实现记下了一些具体的想法 在这个游戏世界中,所有东西都表示为一个游戏对象(车辆、单位、粒子效果等等)。我希望将这些对象隔离,以便在运行时它们之间不存在任何依赖关系 为了实现这一点,我让对象请求其他对象的ID,以便它们可以相互发送消息,并将消息传递给具有该ID的对象 我必须解决的问题是,要有一种从其他对象请求数据的方法。例如,车辆当前是否有驾驶员。我已经考虑过几种方法来实现这一点,但到目前为止,我最接近的是一种特殊类型的消息,发送方向另一个对象发送一条特殊消息,接收对象希望将请求的数据放在该对象中 我写了一个“存根”来说明对象是如何工作的:Java 我在对象之间发送数据的方法有哪些缺陷?,java,oop,Java,Oop,我正在设计一个游戏项目的布局,并为“抽象游戏世界”的实现记下了一些具体的想法 在这个游戏世界中,所有东西都表示为一个游戏对象(车辆、单位、粒子效果等等)。我希望将这些对象隔离,以便在运行时它们之间不存在任何依赖关系 为了实现这一点,我让对象请求其他对象的ID,以便它们可以相互发送消息,并将消息传递给具有该ID的对象 我必须解决的问题是,要有一种从其他对象请求数据的方法。例如,车辆当前是否有驾驶员。我已经考虑过几种方法来实现这一点,但到目前为止,我最接近的是一种特殊类型的消息,发送方向另一个对象发
public class DataRequestMessage extends Message {
public final RequestedDataType dataType;
private boolean requestedDataReceived = false;
private String stringValue;
public DataRequestMessage(MessageType type, RequestedDataType dataType) {
super(type);
this.dataType = dataType;
}
public void setString(String value) {
if(requestedDataReceived) {
throw new RuntimeException("The content of the data request object has already been set");
}
if(dataType != RequestedDataType.String) {
throw new RuntimeException("Data type object expects a value of type " + dataType + ", but received one of type String.");
}
requestedDataReceived = true;
this.stringValue = value;
}
public String getString() {
if(dataType != RequestedDataType.String) {
throw new RuntimeException("This data type object has type " + dataType + ", and can therefore not return a String value.");
}
return stringValue;
}
}
如您所见,当对象未按预期使用时,它将成为雷区。然而,我仍然担心一个对象期望另一个对象做一些事情,从而在两者之间产生依赖关系
此方法是从其他对象请求任意数据的好方法吗?或者期待另一个函数对提供的对象执行操作总是一个坏主意吗?可能与您相关的几点注意事项:
- 您正在实现的是一个已建立的设计,称为Actor模型。在推出自己的系统之前,至少研究一下现有系统能为您做些什么似乎是明智的
- 您基本上放弃了Java的静态类型安全性,并在运行时执行所有检查,就像在动态语言中一样。是的,它实现了解耦,但这必然意味着更多的运行时错误。不过,这些错误很容易追踪和修复;这就是为什么人们不会对动态语言置之不理
- 我建议将数据类型验证作为您的框架的一个特性(或现有的,如果您找到合适的);将该关注点与实际的消息传递分开
这可能是您学习另一种基于JVM的语言的机会,这将使所有这些更容易处理。Scala实现了一个参与者模型,与Java相比,它所需的样板文件要少得多。另一个很好的选择是Clojure。我非常喜欢你最后一点的想法。尽管我仍然需要找到一种方法,从一个“标准化”对象中请求各种类型的数据,而不必为每种数据类型发送垃圾函数,最终可能得到一种非常类似的对象。我知道scala和clojure,但我不确定它们是否足够快,能够处理每秒60帧的性能要求。scala和clojure都可以和普通Java一样快,但您需要知道如何编写性能代码(就像在Java中一样)。我在处理信息检索和批量数据导入+验证的顶级Clojure代码方面拥有丰富的经验,因此我可以直接证明其性能。