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

Java 接口的每个实现类的静态创建者方法

Java 接口的每个实现类的静态创建者方法,java,Java,我需要做一个服务器,可以处理不同种类的消息。 消息以字节流形式出现,并由前2个字节(操作码)标识。 所以我有这个接口 public interface Message<T> extends Encodeable { Message<T> act(T actOn, UserCommandInvocationProtocol<T> protocol); byte[] encode(); // from Encodeable } 用于lam

我需要做一个服务器,可以处理不同种类的消息。 消息以字节流形式出现,并由前2个字节(操作码)标识。 所以我有这个接口

public interface Message<T> extends Encodeable {

    Message<T> act(T actOn, UserCommandInvocationProtocol<T> protocol);

    byte[] encode();  // from Encodeable

}
用于lambdas的接口:

 interface MessageDecoder<T> {

    Message<T> decodeNextByte(byte nextByte);

}
这里的最佳做法是什么?或者我目前的解决方案还可以?
谢谢

您可以在较新版本的Java中使用默认的静态方法,但这可能不是您想要的

您需要另一个类,它知道如何创建消息实例,带有一个开关,该开关将读取几个字节,然后确定要解码的消息,然后将其传递给该消息。你将无法用一个间接的层次来实现这一点。实际上,您希望MessageFactory根据在顶层读取的字节为您进行解析


这是说,如果你想做得更广泛,你应该考虑一个库,比如PotoBuf,它会为你做到这一点。

有时候有一个简单的静态方法来解决所有这些问题,而尝试神奇的语法糖也无济于事。您必须读取两个字节,并将其与对象实例关联,这是无法回避的事实。因此,编写一个简单的静态工厂方法来实现这一点。它读取两个字节,并返回右对象的一个实例

但是,您在哪里指定关联?这可以在全局静态哈希表中完成,或者每个类都可以指定它们关联的字节,初始化器方法将遍历已知的类并构建该映射。这两种方法都没有什么好处,因为最终需要知道实现类的列表

我总是只做一个静态工厂方法。中有一个简单的if-then-else语句,用于测试传入的字节并返回正确的实例。如果有很多类,我将构建某种哈希表来加速查找。但是如果类的数量很小,例如少于30个,那么简单的if-then-else代码可能足够快


静态工厂方法的优点是有一个地方代码与类关联,那就是在这个方法中。

可能合适吗?@Abra是的,我想这就是我在这里要做的,MessageDecoder实际上是factory.switch案例在我的案例中不起作用,因为我希望处理程序不是特定于实现的。所以它实际上是一个抽象类,派生类必须实现setFactorys()方法,该方法根据定义的消息添加MessageDecoder。但我明白了,谢谢。没错,工厂是通过实现实现的,而不是抽象基础实现的。没有解决方法:要么所有类都需要注册它们自己,这样一个工厂就可以工作(我猜您已经这样做了),要么需要使用反射来迭代现有类,使这样一个工厂工作。
 interface MessageDecoder<T> {

    Message<T> decodeNextByte(byte nextByte);

}
public interface Message<T> extends Encodeable {

    Message<T> act(T actOn, UserCommandInvocationProtocol<T> protocol);

    byte[] encode();

    static Message<T> decodeNextByte(byte nextByte):  // does the job of interface MessageDecoder<T>

}