Android Java - 切换问题

时间:2011-09-08 10:28:23

标签: 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.

有任何建议怎么做?

1 个答案:

答案 0 :(得分:1)

你不能真的这样做,你不应该这样做。

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

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