Как чтобы получить предыдущий месяц и год относительно сегодняшнего дня, используя strtotime и дату?

Затем, который лучше: EMACS или vi? Это - одна из рабочих религиозных войн.

Думают о нем этот путь: любая программа, которая является корректна , будет корректна, если язык будет со статическим контролем типов. Тому, что делает статический контроль типов, позволяют, компилятор имеет достаточно информации для обнаружения несоответствий типов во время компиляции вместо времени выполнения. Это может быть раздражением, если Ваше выполнение возрастающих видов программирования, хотя (я поддерживаю), если Вы думаете ясно о своей программе, что это не очень имеет значение; с другой стороны, если Вы создаете действительно большую программу, как операционная система или телефонный коммутатор, с десятками или сотнями или тысячами людей, работающих над ним, или с действительно высокими требованиями надежности, затем имея его компилятор быть в состоянии обнаружить большой класс проблем для Вас, не нуждаясь в тестовом сценарии для осуществления просто правильного пути выполнения кода.

Это не, как будто динамический контроль типов является новой и другой вещью: C, например, эффективно с динамическим контролем типов, так как я могу всегда бросать foo* к bar*. Это просто означает, что это - тогда моя обязанность в качестве программиста C никогда не использовать код, который является соответствующим на bar*, когда адрес действительно указывает foo*. Но в результате проблем с большими программами, C вырастил инструменты как линт (1), усилил его систему типов с typedef и в конечном счете разработал вариант со строгим контролем типов в C++. (И, конечно, C++ в свою очередь разработал пути вокруг строгого контроля типов со всеми вариантами бросков и дженериков/шаблонов и с RTTI.

Еще одна вещь, хотя---не путают "гибкое программирование" с "динамическими языками". Гибкое программирование о способе, которым люди сотрудничают в проекте: проект может адаптироваться к изменяющимся требованиям для удовлетворения потребностей клиентов при поддержании гуманной среды для программистов? Это может быть сделано с динамически типизированными языками, и часто, потому что они могут быть более продуктивными (например, Ruby, Smalltalk), но это может быть сделано, был сделан успешно, в C и даже ассемблере. На самом деле, Ралли Development даже использование гибкие методы (ТОЛПА в особенности), чтобы сделать маркетинг и документацию.

30
задан Federico Zancan 25 January 2013 в 11:30
поделиться

4 ответа

Есть несколько способов; до версии 1.8 возможно сделать самый простой способ:

@JsonDeserialize(as=Cat.class)
public abstract class AbstractAnimal { ... }

принять решение на основе атрибута, что лучше всего сделать с помощью @JsonTypeInfo, который выполняет автоматическое встраивание (при записи) и использование информации о типе.

Существует несколько видов информации о типе (имя класса, имя логического типа), а также механизмы включения (свойство as-enabled, массив as-wrapper, объект as-wrapper). Эта страница: https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization объясняет некоторые концепции.

41
ответ дан 28 November 2019 в 00:07
поделиться

проблема, которую можно решить с помощью аннотации @JsonDeserialize для абстрактного класса, относится к проблемам и решениям исключений Джексона https://www.baeldung.com/jackson-exception

1
ответ дан 28 November 2019 в 00:07
поделиться

Полноценный ответ с очень четким примером можно найти здесь: https://stackoverflow.com/a/30386694/584947

Джексон называет это Полиморфной десериализацией.

Это определенно помогло мне с моей проблемой. У меня был абстрактный класс, который я сохранял в базе данных, и мне нужно было распаковать его в конкретный экземпляр класса (по понятным причинам).

Он покажет вам, как правильно аннотировать родительский абстрактный класс и как научить Джексона выбирать среди доступных кандидатов в подклассы во время выполнения при демаршалинге.

2
ответ дан 28 November 2019 в 00:07
поделиться

Если вы не хотите загрязнять ни свой JSON дополнительными полями, ни свои классы аннотациями, вы можете написать очень простой модуль и десериализатор, который использует нужный подкласс по умолчанию. Это несколько строк из-за какого-то стандартного кода, но все же это относительно просто.

class AnimalDeserializer extends StdDeserializer<Animal> {
    public AnimalDeserializer() {
        super(Animal.class);
    }

    public Animal deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
        return jsonParser.readValueAs(Cat.class);
    }
}

class AnimalModule extends SimpleModule {
    {
        addDeserializer(Animal.class, new AnimalDeserializer());
    }
}

Затем зарегистрируйте этот модуль для ObjectMapper и все (Zoo - это контейнерный класс, который имеет поле Animal).

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new AnimalModule());
return objectMapper.readValue(json, Zoo.class);
0
ответ дан 28 November 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: