admin 29 октября 2017

Скрытые возможности в Java

В этой статье вы сможете открыть для себя несколько удивительных, а иногда и странных фактов, которые имеют место в Java.

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

☕ Подтянуть свои знания по Java вы можете на нашем телеграм-канале «Библиотека Java для собеса»


java duke

1. Double brace

В этом рейтинге с большим отрывом лидирует «double brace». Здесь можно найти подробное описание метода. Это самое забавное и не очевидное из списка. Однако метод имеет свои минусы в виде анонимного класса на каждое использование этого метода, а также невозможности использования метода equals() для подобных объектов.

2. ThreadLocal

ThreadLocal — незаслуженно забытый класс, существующий ещё с версии 1.2. Он стал даже более привлекательным, подружившись с generics. Класс позволяет иметь различное значение для каждого из потоков с использованием только одной переменной. Описание по ссылке.

3. Instance Initializers

Если эта возможность ушла от вашего взгляда — тогда пример ниже отлично и без лишних слов продемонстрирует её.

public class Foo {
  public Foo() {
    System.out.println("constructor called");
  }

  static {
    System.out.println("static initializer called");
  }

  {
    System.out.println("instance initializer called");
  }
}

 

Выполним:

new Foo();
new Foo();

 

На выходе получим:

static initializer called
instance initializer called
constructor called
instance initializer called
constructor called

4. Именованные блоки и метки в Java

Нечто малоиспользуемое, однако всё так же компилируемое:

twoCycle:
    {
      while (true) {
        while (true) {
          break twoCycle;
        }
      }

    }

Здесь также вспоминается факт о зарезервированных словах const и goto, которые являются ключевыми, однако использовать их нельзя. Ещё метки дают забавный эффект. Код ниже отлично компилируется (отлично громко сказано, компилятор такое без ворчания не пропустит).

class Example {
  public static void main(String[] args) {
    System.out.println("Hello World!");
    http://Phi.Lho.free.fr

    System.exit(0);
  }
}

🧩☕ Интересные задачи по Java для практики можно найти на нашем телеграм-канале «Библиотека задач по Java»


5. Enum — это класс

И в нем можно определить конструктор, статические и не очень методы. А также у любого enum есть методы, которые возвращают все значения, а по строковому имени элемента возвращают объект:

public static E[] values();
public static E valueOf(String name);

6 Finally и return

finally может “съесть” любой эксепшн. Подробнее здесь.

public static int f() {
    try {
      throw new RuntimeException();
    } finally {
      return 0;
    }
  }

Победить finally может только System.exit(..)

7. Коллекции

Метод asList в java.util.Arrays значительно преобразился начиная с версии 1.5. Выражение ниже не было бы возможным без списка аргументов переменной длины, autoboxing'а и generics.

List<Integer> ints = Arrays.asList(1,2,3);</p>

Типы для параметризованных методов могут быть указаны следующим способом:

Collections.<String,Integer>emptyMap()

static import'ы при всей неоднозначности могут помочь создать эффект потрясающей лаконичности.

List<String> ls = List("a", "b", "c"); 
List<Map<String, String>> data = List(Map( o("name", "michael"), o("sex", "male")));

Подробнее по ссылке.

Кстати — List.subList(int fromIndex, int toIndex) возвращает view оригинального объекта. Это документированная, однако мало распространённая возможность. Позволяет работать с подсписком, при этом изменения sub-листа будут отражены и в родительском объекте.

8. Класс URL

Значение выражения

new URL("http://www.yahoo.com").equals(new URL("http://209.191.93.52"))

— true

9. Инициализация final переменной

Инициализация final переменной может быть отложена

public Object getElementAt(int index) {
  final Object element;
  if (index == 0) {
     element = "Result 1";
  } else if (index == 1) {
     element = "Result 2";
  } else {
     element = "Result 3";
  }
  return element;
}

 

Дополнительные материалы по теме:

Подборка материалов и видеокурсов по Java

6 книг по Java для программистов любого уровня

10 must-have книг для Java-разработчика

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ