logo

Автоматическое определение типа в Java: аналог "auto" в C++

Быстрый ответ

Java обеспечивает вывод типов для локальных переменных с использованием var. Определите переменную с var, и Java самостоятельно определит её тип на основе присвоенного значения:

Java
Скопировать код
var число = 123; // int
var сообщение = "Привет"; // String

Обратите внимание: var может быть применено только в основном теле метода, классовые поля, параметры метода или возвращаемые значений эту возможность не поддерживают. Это делает код более лаконичным и эффективным, при этом сохраняя безопасность типов.

Еволюция вывода типов в Java

До Java 10: Эпоха подробных объявлений

До появления Java 10 приходилось применять подробные объявления типов. Они были функционально эффективны, но чрезвычайно объёмны.

Java
Скопировать код
List<String> списокСПространнымОбъявлением = new ArrayList<String>(); // Не самый краткий вариант, не так ли?

В Java 7 был представлен оператор алмаза (<>), который сократил эту избыточность.

Java
Скопировать код
List<String> менееМногословныйСписок = new ArrayList<>(); // Так гораздо лучше!

Переход к Java 8: Появление лямбда-выражений

Java 8 внесла лямбда-выражения и ссылки на методы, что сделало язык менее многословным и более читаемым.

Java
Скопировать код
// Старый способ:
new Thread(new Runnable() {
    public void run() {
        System.out.println("Бегу, словно гепард!");
    }
}).start();

// Новый стиль:
new Thread(() -> System.out.println("Бегу, словно гепард!")).start();

Встроенные функии, например forEach, и ссылки на методы, такие как System.out::println, упростили код и облегчили понимание типов.

После Java 10: 'var' меняет подход

С Java 10 пришел var, позволивший использовать вывод типов для локальных переменных, что существенно изменило процесс написания кода.

Java
Скопировать код
// Вот как это было ранее:
ArrayList<String> список = new ArrayList<String>();

// Вот что изменилось с Java 10:
var список = new ArrayList<String>(); // Кратко и понятно!

Это сократило объемность, повысило производительность и сделало код более понятным.

Лучшие практики и подводные камни

Находите баланс между читабельностью и выводом

Не злоупотребляйте использованием var – он идеален, когда тип очевидно следует из контекста. Однако, если явное определение типа улучшает читабельность кода, стоит отказаться от var.

Java
Скопировать код
var название = "Изумрудный склон"; // Очевидно, что это String

var с = new Сотрудник(); // 'с' это что? Сокращение? Снаряд?

Сотрудник сотрудник = new Сотрудник(); // Тут все ясно от начала и до конца.

'var' не для всех типов

Используйте var для облегчения работы со сложными типами, но избегайте его перегрузки – новички не оценят.

Использование с осторожностью

var применим только при определении локальных переменных. При инициализации переменных var требует ясного значения для определения типа. Неинициализированные переменные – это не про var.

Java
Скопировать код
var имя; // Не сработает
var пустойСписок = null; // Так тоже не прокатит

Визуализация

Рассмотрим вывод типов в Java на простых примерах:

Markdown
Скопировать код
| До Java 7                              | После Java 10 с 'var'                 |
| -------------------------------------- | ------------------------------------- |
| Вручную указываем каждый тип           | Умная корзина сама понимает, что в ней |
| `List<String> корзина = new ArrayList<String>();` | `var корзина = new ArrayList<String>();` |

var работает как умная корзина, определяя содержимое по тому, что вы в неё положили:

Markdown
Скопировать код
Традиционный подход: [🍎String, 🍌String, 🍊String]
Современный подход: [🍎, 🍌, 🍊] // Всё равно понятно, что это фрукты (Strings)!

Полезные материалы

  1. Документация Oracle о выводе типов
  2. Руководство по использованию 'var' в Java 10
  3. Обсуждение возможности вывода типов в Java на Stackoverflow
  4. Руководство Oracle по использованию 'var' в Java SE 10
  5. Видео: Объяснение механизма вывода типов в Java