Рубрики
Без рубрики

Вступающий в силу Java Вторник! Избегайте Создания Ненужных Объектов!

Погружение в шестую главу книги “Эффективная Java”. Помеченный как java, эффективный, дизайн, архитектура.

Эффективный обзор Java (Серия из 78 частей)

Сегодня мы переходим к нашему шестому пункту из Эффективной Java. Название этой книги особенно вызывает у меня улыбку. Избегайте создания ненужных объектов. Что может быть более противоречивым, чем сказать: “Не делай того, что тебе не нужно делать. “Мы все ищем кратчайший путь к тому, как быстрее выполнить работу, поэтому эту мы автоматически получаем бесплатно, верно? Ну, не совсем, на самом деле здесь можно сказать немного больше, чем “Быть ленивым”. Так что давайте начнем.

Так зачем кому-то делать то, что ему не нужно делать? Что ж, мы рассмотрим некоторые из способов, которыми это может произойти в этом посте, но я бы резюмировал большинство этих случаев просто следующим образом: невежество и недостаток внимания. Это вполне объяснимо. Иногда мы просто не осознаем, какой вред мы можем нанести, или мы знаем, что нужно чего-то избегать, но можем не осознавать, что мы это делаем.

Давайте начнем с первого примера из книги:

String title = new String("Effective Java");

Так что же это делает? Ну, он делает именно то, что, похоже, будет делать, он создает новую строку при каждом вызове. Но это не то, что мы на самом деле хотим сделать. Это просто создает больше объектов для очистки сборщика мусора без какой-либо пользы. Сравните это с более эффективным способом достижения этой цели, который также оказывается более чистым:

String title = "Effective Java";

В этом случае никакие дополнительные объекты не будут созданы независимо от того, сколько раз будет запущена эта строка. Также из-за Интернирования строк если одна и та же статическая строка отображается в JVM несколько раз, она будет выделена только один раз, что является забавным советом по экономии памяти.

Так зачем кому-то делать первый пример? Хороший вопрос. Я предполагаю, что было бы просто не знать, что это имеет отрицательный эффект.

Итак, каковы некоторые способы, которыми мы можем помочь избежать создания ненужных объектов? Что ж, неудивительно, что книга начинается с обсуждения статических фабричных методов , поскольку она снова появляется в качестве решения. Как упоминалось в этой статье, используя статический фабричный метод, мы можем определить, хотим ли мы создать новый объект или нет, тогда как с конструктором мы вынуждены каждый раз создавать новый объект. Пример этого можно увидеть с объектом Boolean :

Boolean trueBoolean = new Boolean("true");
// vs
Boolean falseBoolean = Boolean.parseValue("false");

Давайте рассмотрим другой пример места, где разработчики иногда сталкиваются с проблемами при создании ненужных объектов. На этот раз это упакованные типы. Давайте рассмотрим пример из книги:

private static long sum() {
  Long sum = 0L;
  for (int i = 0; i< Integer.MAX_VALUE; i++) {
    sum += i; 
  }
  return sum;
}

Единая столица L делает этот код намного менее эффективным, когда мы снова и снова упаковываем и распаковываем значения, создавая все больше и больше объектов без причины. Те, с кем я работаю, знают, что я не большой поклонник коробочных типов. Я вижу, как люди случайно используют их без уважительной причины, и они могут иметь тонкие эффекты, которые люди не осознают.

Итак, в этих предыдущих примерах мы видели создание ненужных маленьких объектов. Хотя этого все равно следует избегать, потребуется много раз повторять эту ошибку, прежде чем она действительно начнет влиять на нашу производительность. В каких других случаях нам следует особенно беспокоиться о создании ненужных объектов? Что ж, даже если мы создадим всего несколько ненужных объектов, если мы создадим дорогостоящие объекты без необходимости, это может иметь значение, поэтому нам нужно быть особенно осторожными с этими дорогими объектами. Наиболее распространенным примером этого являются пулы подключений к базе данных. Я лично не буду вдаваться в подробности, так как считаю, что логике просто следовать, однако я хотел упомянуть об этом как о чем-то, о чем нужно позаботиться.

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

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

Эффективный обзор Java (Серия из 78 частей)

Оригинал: “https://dev.to/kylec32/effective-java-tuesday-avoid-creating-unnecessary-objects-4nn8”