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