我正在测试一个需要连接到服务器并保存其响应的测试应用程序。响应实际上是一个数据包,因此我需要了解它是什么类型并执行它。现在,我可以接收响应,计算数据包,现在我需要在需要的切换方法方面提供一些帮助获取数据包类型。
这是我正在使用的代码:
RPCPacket packet=null;
switch(RPCPacketType.getPacketTypeByValue(pType)){
case ST_OBJECT_TYPE_INFO_START:
{
packet = new InfoStartRPCPacket( objectIdentificator,
RPCPacketType.getPacketTypeByValue(pType),
RPCOperationType.getByValue(Integer.parseInt(operation)),
objectId,
id,
Integer.parseInt(size),
hash,
RPCPacketDataType.getByValue(dataType),
first );
break;
}
case ST_OBJECT_TYPE_INFO_END:{
packet = new InfoEndRPCPacket();
break;
}
case ST_OBJECT_TYPE_INFO_ERROR:{
packet = new InfoErrorRPCPacket();
break;
}
// Basic packets
case ST_OBJECT_TYPE_COLLECTION:{
packet = new CollectionRPCPacket();
break;
}
case ST_OBJECT_TYPE_CATEGORY:{
packet = new CategoryRPCPacket();
break;
}
case ST_OBJECT_TYPE_CARD:{
packet = new CardRPCPacket();
break;
}
case ST_OBJECT_TYPE_MESSAGE:{
packet = new MessageRPCPacket();
break;
}
case ST_OBJECT_TYPE_GENRE:{
packet = new GenreRPCPacket();
break;
}
case ST_OBJECT_TYPE_TAG:{
packet = new TagRPCPacket();
break;
}
case ST_OBJECT_TYPE_USER:{
packet = new UserRPCPacket();
break;
}
case ST_OBJECT_TYPE_CARDSTATS_CATEGORY:{
packet = new CardStatsCategoryRPCPacket();
break;
}
case ST_OBJECT_TYPE_CONTENT:{
packet = new ContentRPCPacket();
break;
}
// Media packets
case ST_OBJECT_TYPE_MEDIA_COLLECTION:{
packet = new MediaCollectionRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_CATEGORY:{
packet = new MediaCategoryRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_CARD:{
packet = new MediaCardRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_TAG:{
packet = new MediaTagRPCPacket();
break;
}
case ST_OBJECT_TYPE_MEDIA_COLLECTION_BUTTON:{
packet = new MediaCollectionButtonRPCPacket();
break;
}
// unknown packet
default: {
packet=null;
break;
}
}
在检查所有开关后,我需要一种能够将数据包初始化为InfoStartRPCPacket或其他方式的方法。基本上,我希望能够在外部开关上执行以下操作:
packet.executeInfoStartPacket(/*params*/); , when executeInfoStartPacket is a method in InfoStartRPCPacket class.
有什么建议怎么做?
最佳答案
您不能真正做到这一点,也不应这样做。
相反,您可以在abstract
类中称为RPCPacket
的方法中使用一个process()
方法(可能提供任何必要的上下文作为参数),并在每个特定的子类中重载该方法。
这样,特定于数据包的代码将自动访问所有特定于数据包的字段和方法。