java - Android Java - 开关问题

标签 java android switch-statement

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

这是我使用的代码:

                    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.

有什么建议吗?

最佳答案

你真的不能那样做,也不应该那样做。

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

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

关于java - Android Java - 开关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346570/

相关文章:

java - 如何对 JavaFX 应用程序进行签名并将其部署到单个 .JAR 中?

java - Android:getX getY 初始延迟

java - 如何在android中修复libpng

java - 如何动态更改文本框中文本的大小

java - ArrayList彩票游戏-多余的数组列表

c++ - 在开关盒中返回 bool 值

PHP 从 MySQL 查询切换页面

android - ScrollView 在 Android Studio 中显示内容但在应用程序中不显示

java - 新的 Gradle 依赖项未添加到项目和外部依赖项 (VSCode)

android - 如何在 Android Studio 中排除重命名的某些术语