abstract class Event
                  
                  
                  
                  
                  
                  
                  
                  
                  от него наследуется куча классов около 15-20 штук , у них у всех ряд полей одинаковый , а рад полей (тело) у каждого евента свое, что соответсвенно  отражается в классе.
                  
                  
                  И есть общий метод, но щас он работает только на EventLPublicInfo :
                  
                  
                  
                  
                  
                  public EventLPublicInfo build(byte[] bytes) {
                  
                  
                  
                  
                  
                          final AtomicLong messageLength = new AtomicLong();
                  
                  
                  
                  
                  
                          return EventLPublicInfo.builder()
                  
                  
                                  //TODO вынести из парсинга отдельно хеадер файла?
                  
                  
                  //                .mainVersion(parseInt8(bytes, index))
                  
                  
                  //                .subVersion(parseInt8(bytes, index))
                  
                  
                  //                .spare(parseOctetString(bytes, index, 30))
                  
                  
                                  .eventId(parseUInt16(bytes, index))
                  
                  
                                  .eventLength(getEventLength(bytes, messageLength))
                  
                  
                                  .eNodeBID(parseUInt32(bytes, index))
                  
                  
                                  .cellId(parseUInt8(bytes, index))
                  
                  
                                  .callId(parseUInt32(bytes, index))
                  
                  
                                  .year(parseUInt8(bytes, index))
                  
                  
                                  .month(parseUInt8(bytes, index))
                  
                  
                                  .day(parseUInt8(bytes, index))
                  
                  
                                  .hour(parseUInt8(bytes, index))
                  
                  
                                  .minute(parseUInt8(bytes, index))
                  
                  
                                  .second(parseUInt8(bytes, index))
                  
                  
                                  .millisecond(parseUInt16(bytes, index))
                  
                  
                                  .extendHeadLength(parseUInt8(bytes, index))
                  
                  
                                  .itemType(BITString.ITEM_TYPE.getParam((byte) parseUInt8(bytes, index)))
                  
                  
                                  .crnti(parseUInt16(bytes, index))
                  
                  
                                  .messageContent(ServiceChainMessageContent.getMessageContent(bytes, index, messageLength.get()))
                  
                  
                  
                  
                  
                                  .index(index.get())
                  
                  
                                  .build();
                  
                  
                  
                  
                  
                      }
                  
                  
                  Сейчас он возвращает только EventLPublicInfo
                  
                  
                  Если я его привожу к классу Event во первых его не получиться использовать как абстрактный так как билдер использую , придется class Event приводить к классу
                  
                  
                  Если джинерики использую то говорит у типа T.builder нет такого метода (создать данный класс в общем предлагает) 
                  
                  
                  
                  
                  
                  
                  
                  
                  public Event build(byte[] bytes) {
                  
                  
                  
                  
                  
                          final AtomicLong messageLength = new AtomicLong();
                  
                  
                  
                  
                  
                          return Event.builder()
                  
                  
                                  //TODO вынести из парсинга отдельно хеадер файла?
                  
                  
                  //                .mainVersion(parseInt8(bytes, index))
                  
                  
                  //                .subVersion(parseInt8(bytes, index))
                  
                  
                  //                .spare(parseOctetString(bytes, index, 30))
                  
                  
                                  .eventId(parseUInt16(bytes, index))
                  
                  
                                  .eventLength(ServiceEventLength.getEventLength(bytes, messageLength))
                  
                  
                                  .eNodeBID(parseUInt32(bytes, index))
                  
                  
                                  .cellId(parseUInt8(bytes, index))
                  
                  
                                  .callId(parseUInt32(bytes, index))
                  
                  
                                  .year(parseUInt8(bytes, index))
                  
                  
                                  .month(parseUInt8(bytes, index))
                  
                  
                                  .day(parseUInt8(bytes, index))
                  
                  
                                  .hour(parseUInt8(bytes, index))
                  
                  
                                  .minute(parseUInt8(bytes, index))
                  
                  
                                  .second(parseUInt8(bytes, index))
                  
                  
                                  .millisecond(parseUInt16(bytes, index))
                  
                  
                                  .extendHeadLength(parseUInt8(bytes, index))
                  
                  
                                  .itemType(BITString.ITEM_TYPE.getParam((byte) parseUInt8(bytes, index)))
                  
                  
                                  .crnti(parseUInt16(bytes, index))
                  
                  
                                  .messageContent(ServiceChainMessageContent.getMessageContent(bytes, index, messageLength.get()))
                  
                  
                  
                  
                  
                                  .index(index.get())
                  
                  
                                  .build();
                  
                  
                      }
                  
                  
                  
                  
                  
                  если так сделаю типа Event возвращаю, builder() не работает, так как Event  это абстрактный класс
                  
                  
                  
                  
                  
                  
                  
                  
                  А я хочу чтобы на основании к примеру id eventa он мне возвращал конкретный тип , 
                  
                  
                  ЩАс у меня куча классов под каждый евент...
                  
                  
                   Есть идеи как можно сделать?
                  
                  
                
вынести сборку в стратегию и передавать её в качестве параметра вместе с массивом байт, стратегия будет возвращать тип-наследник а метод build более общий тип-родитель
Обсуждают сегодня