Android Java - 切换问题

发布于 2024-12-04 02:41:51 字数 4671 浏览 1 评论 0原文

我正在开发一个测试应用程序,它需要连接到服务器并保存来自服务器的响应。响应实际上是一个数据包,所以我需要了解它是什么类型的数据包并执行它。现在我可以接收响应,计算数据包,现在我需要一些关于我想要的 switch 方法的帮助获取数据包类型。

这是我正在使用的代码:

                    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.

任何建议如何这样做吗?

I'm working on a test application which requires connection to server and save the response from it. The response actually is a data packet,so I need to understand what type of packet it is and to execute it.For now I can receive the response, calculate the data packet and now I need a little help with switch method where I want to get the packet type.

Here is the code I'm using :

                    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;
                        }
                    }

I need a way to be able to initialize the packet as InfoStartRPCPacket or something different after I check the all switches.Basically I want to be able to do something like this outside switch :

packet.executeInfoStartPacket(/*params*/);  , when executeInfoStartPacket is a method in InfoStartRPCPacket class.

Any suggestions how to do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光与爱终年不遇 2024-12-11 02:41:51

你真的不能这么做,也不应该这么做。

相反,您可以在 RPCPacket 类中有一个名为 process()abstract 方法(可能提供任何必要的上下文作为参数),并在每个具体子类。

这样,特定于数据包的代码可以自动访问所有特定于数据包的字段和方法。

You can't really do that and you shouldn't.

Instead you could have an abstract method in your RPCPacket class called process() (possibly giving any necessary context as parameters) and overload that in each specific sub-class.

This way the packet-specific code automatically has access to all the packet-specific fields and methods.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文