Как работает lock_guard? [Дубликат]

На Java существует множество библиотек JSON.

Наиболее известными являются: Джексон, GSON, Genson, FastJson и org.json.

Обычно есть три вещи следует искать для выбора любой библиотеки:

  1. Производительность
  2. Простота использования (код прост для записи и разборчивости) - это касается функций.
  3. Для мобильных приложений: зависимость / размер jar

В частности, для библиотек JSON (и любых сериализационных / десериализационных библиотек) также важна привязка данных, поскольку она устраняет необходимость написания кода котельной пластины для упаковки / распаковки данных.

Для 1 см. этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH , который сравнивает (jackson, gson, genson, fastjson, org.json, jsonp) производительность сериализаторов и десериализаторов с использованием API потоков и данных. Для 2 вы можете найти множество примеров в Интернете. Вышеупомянутый эталон также может быть использован в качестве источника примеров ...

Быстрое выведение теста: Джексон выполняет в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чем GSON.

Для вашего конкретного примера следующий код расшифровывает ваш json с помощью jackson:

public class MyObj {

    private PageInfo pageInfo;
    private List posts;

    static final class PageInfo {
        private String pageName;
        private String pagePic;
    }

    static final class Post {
        private String post_id;
        @JsonProperty("actor_id");
        private String actorId;
        @JsonProperty("picOfPersonWhoPosted")
        private String pictureOfPoster;
        @JsonProperty("nameOfPersonWhoPosted")
        private String nameOfPoster;
        private String likesCount;
        private List comments;
        private String timeOfPost;
    }

    private static final ObjectMapper JACKSON = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
    }
}

Сообщите мне, если у вас есть какие-либо вопросы.

183
задан sbi 6 March 2014 в 07:08
поделиться

6 ответов

Книга Программирование на C ++ с шаблонами проектирования описывает RAII как:

  1. Приобретение всех ресурсов
  2. Использование ресурсов
  3. Освобождение ресурсов

Где

  • Ресурсы реализованы как классы, и все указатели вокруг них обертывают оболочками (делая их умными указателями).
  • Ресурсы приобретаются путем вызова их конструкторов и освобождения неявно (в обратном порядке получения) путем вызова их деструкторов.
9
ответ дан Dennis 24 August 2018 в 02:16
поделиться

Ручное управление памятью - это кошмар, который программисты изобретают способы избежать с момента изобретения компилятора. Языки программирования с сборщиками мусора облегчают жизнь, но ценой производительности. В этой статье - Устранение сборщика мусора: путь RAII , инженер Toptal Питер Гудпед-Никлаус дает нам заглянуть в историю сборщиков мусора и объясняет, как понятия собственности и заимствования могут помочь устранить сборщики мусора без компрометируя их гарантии безопасности.

2
ответ дан Dmitry Pavlov 24 August 2018 в 02:16
поделиться

В класс RAII есть три части:

  1. Ресурс отказался от деструктора
  2. Экземпляры класса выделяются в стеке
  3. Ресурс приобретается в конструкторе. Эта часть является необязательной, но распространенной.

RAII означает «Инициализация ресурсов». Часть «сбор ресурсов» RAII - это то, где вы начинаете то, что должно быть закончено позже, например:

  1. Открытие файла
  2. Выделение некоторой памяти
  3. Приобретение блокировки

Часть «инициализация» означает, что это происходит внутри конструктора класса.

https: // www. tomdalling.com/blog/software-design/resource-acquisition-is-initialisation-raii-explained/

1
ответ дан Mohammad Moridi 24 August 2018 в 02:16
поделиться

Это идиома программирования, которая вкратце означает, что вы

  • инкапсулируете ресурс в класс (чей конструктор обычно - но не обязательно ** - приобретает ресурс, а его деструктор всегда выпускает его )
  • используют ресурс через локальный экземпляр класса *
  • , ресурс автоматически освобождается, когда объект выходит из области видимости

гарантирует, что все, что происходит во время использования ресурса, в конечном итоге будет освобождено (из-за нормального возврата, уничтожения содержащегося объекта или из-за исключения).

Это широко используемая передовая практика в C ++, потому что, помимо безопасного использования ресурсов, он также делает ваш код намного чище, так как вам не нужно смешивать код обработки ошибок с основными функциями.

* Обновление: local "может означать локальную переменную или нестатистическую переменную-член класса. В последнем случае переменная-член инициализируется и уничтожается с помощью объекта-владельца.

** Update2: как указывал @sbi, ресурс, хотя он часто выделяется внутри конструктора, также может быть выделен вне и передается как параметр.

91
ответ дан Péter Török 24 August 2018 в 02:16
поделиться

«RAII» означает «Инициализация ресурсов» и на самом деле является довольно неправильным, поскольку он не является ресурсом получения (и инициализацией объекта), с которым он связан, но освобождение ресурса (посредством уничтожения объекта). Но RAII - это имя, которое мы получили, и оно прилипает.

В самом своем сердце, функция идиомы включает в себя инкапсуляцию ресурсов (куски памяти, открытые файлы, разблокированные мьютексы, вы-name-it) в локальных , автоматических объектах и имеющие деструктор этого объекта, освобождающий ресурс, когда объект уничтожается в конце области, к которой он принадлежит:

{
  raii obj(acquire_resource());
  // ...
} // obj's dtor will call release_resource()

Конечно, объекты не всегда являются локальными, автоматическими объектами. Они также могут быть членами класса:

class something {
private:
  raii obj_;  // will live and die with instances of the class
  // ... 
};

Если такие объекты управляют памятью, их часто называют «умными указателями».

Есть много вариаций этого. Например, в первых фрагментах кода возникает вопрос, что произойдет, если кто-то захочет скопировать obj. Самый простой выход - просто запретить копирование. std::unique_ptr<>, умный указатель, который будет частью стандартной библиотеки, как показано на следующем стандарте C ++, делает это. Другой такой умный указатель std::shared_ptr имеет свойство «совместного использования» ресурса (динамически выделенного объекта), которое он удерживает. То есть, он может свободно копироваться и все копии относятся к одному и тому же объекту. Умный указатель отслеживает, сколько копий относится к одному и тому же объекту, и удаляет его, когда последний уничтожается. Третий вариант представлен std::auto_ptr, который реализует своего рода семантику move: объект принадлежит только одному указателю, и попытка копирования объекта приведет (через синтаксический хакер) к передаче права собственности на объект на цель операция копирования.

40
ответ дан Ry- 24 August 2018 в 02:16
поделиться

Это действительно страшное имя для невероятно мощной концепции и, возможно, одной из тех вещей, которые разработчики C ++ пропускают, когда они переключаются на другие языки. Было немного движения, чтобы попытаться переименовать эту концепцию как управление ресурсами, ограниченным областью действия, хотя пока она, похоже, пока не попалась.

Когда мы говорим «Ресурс», мы имеем в виду не только память, но и файловые дескрипторы, сетевые сокеты, дескрипторы баз данных, объекты GDI ... Короче говоря, вещи, которые у нас есть поэтому мы должны иметь возможность контролировать их использование. Аспект «Связанный с областью» означает, что время жизни объекта связано с областью действия переменной, поэтому, когда переменная выходит из области видимости, деструктор освободит ресурс. Очень полезным свойством этого является то, что он обеспечивает большую безопасность исключений. Например, сравните это:

RawResourceHandle* handle=createNewResource();
handle->performInvalidOperation();  // Oops, throws exception
...
deleteResource(handle); // oh dear, never gets called so the resource leaks

С RAII one

class ManagedResourceHandle {
public:
   ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
   ~ManagedResourceHandle() {delete rawHandle; }
   ... // omitted operator*, etc
private:
   RawResourceHandle* rawHandle;
};

ManagedResourceHandle handle(createNewResource());
handle->performInvalidOperation();

В этом последнем случае, когда исключение выбрано и стек разматывается, локальные переменные который гарантирует, что наш ресурс очищается и не течет.

275
ответ дан the_mandrill 24 August 2018 в 02:16
поделиться
Другие вопросы по тегам:

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