Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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_Oop - Fatal编程技术网

Java 我在对象之间发送数据的方法有哪些缺陷?

Java 我在对象之间发送数据的方法有哪些缺陷?,java,oop,Java,Oop,我正在设计一个游戏项目的布局,并为“抽象游戏世界”的实现记下了一些具体的想法 在这个游戏世界中,所有东西都表示为一个游戏对象(车辆、单位、粒子效果等等)。我希望将这些对象隔离,以便在运行时它们之间不存在任何依赖关系 为了实现这一点,我让对象请求其他对象的ID,以便它们可以相互发送消息,并将消息传递给具有该ID的对象 我必须解决的问题是,要有一种从其他对象请求数据的方法。例如,车辆当前是否有驾驶员。我已经考虑过几种方法来实现这一点,但到目前为止,我最接近的是一种特殊类型的消息,发送方向另一个对象发

我正在设计一个游戏项目的布局,并为“抽象游戏世界”的实现记下了一些具体的想法

在这个游戏世界中,所有东西都表示为一个游戏对象(车辆、单位、粒子效果等等)。我希望将这些对象隔离,以便在运行时它们之间不存在任何依赖关系

为了实现这一点,我让对象请求其他对象的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代码方面拥有丰富的经验,因此我可以直接证明其性能。