1. Java / Говнокод #16840

    +119

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    static void writeInternal(byte type, Object object, ObjectOutput out) throws IOException {
        out.writeByte(type);
        switch (type) {
            case DURATION_TYPE:
                ((Duration) object).writeExternal(out);
                break;
            case INSTANT_TYPE:
                ((Instant) object).writeExternal(out);
                break;
            ...
            <snip>
            ...
            case PERIOD_TYPE:
                ((Period) object).writeExternal(out);
                break;
            default:
                throw new InvalidClassException("Unknown serialized type");
        }
    }

    JDK 8. java.time.Ser.

    Вот что происходит, когда в языке есть только public-наследование. Без рефлексии короче написать нельзя.

    Запостил: someone, 12 Октября 2014

    Комментарии (10) RSS

    • А чем здесь поможет приватное наследование?
      Ответить
      • Ну, не приватное, а, скажем, package-private наследование. Чтобы все эти классы могли реализовать Externalizable, но так, чтобы факт реализации этого интерфейса был виден только классам в том же пакете.
        Ответить
        • А чем факт реализации этого интерфейса будет мешать другим классам? Просто не документировать его, да и всё.
          Ответить
          • Реализация package-private метода writeExternal - это деталь реализации сериализации (а теперь скажите это три раза и быстро) и наружу она торчать не должна, тем более в стандартной библиотеке, иначе придётся тащить груз обратной совместимости до морковкина заговенья.
            Ответить
            • Юзаешь недокументированные детали реализации - ССЗБ. Так что пускай торчит, просто в доке не надо писать, что она там есть. Ну либо написать, что это деталь реализации, и юзать ее запрещено.
              Ответить
              • Предлагаешь вставить костыль в жавадок, который будет выкидывать интерфейсы из списка реализованных интерфейсов?
                Ответить
        • >Ну, не приватное, а, скажем, package-private наследование. Чтобы все эти классы могли реализовать Externalizable
          Ну сделали же для StringBuilder/StringBuffer абстрактного предка (AbstractStringBuilder), который package-private.
          Ответить
    • Кмк, можно вот как сделать:
      Для каждого класса запилить SerializationProxy - package-private класс, содержащий сериализуемое состояние объекта, добавить package-private методы для конвертации полноценного объкта в прокси и получения полноценного объекта из прокси.
      Ответить
      • Там так и сделано, просто прокси один на все классы пакета java.time (это и есть класс Ser). Но в нём длинная портянка, проверяющая тип объекта, создавшего прокси, и вызывающая package-private метод writeExternal для каждого класса отдельно.
        Ответить
    • При том что в других пакетах java.time.chrono, java.time.zone похожий класс Ser.
      Может таким образом они проверяют что тип объекта соответуствует type?!
      Ну действительно похоже на какашу. Так они еще это прокси-выSer создают на каждой сериализации.
      Ответить

    Добавить комментарий