Five Features to Make Java Even Better

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Я наткнулся на этот предложение от Брайана Гоэтца о классах данных в Java и сразу осознал, что у меня тоже есть несколько идей о том, как сделать Java лучше в качестве языка. У меня есть много идей, но вот краткий список из пяти самых важных.

Глобальные переменные. В Java есть Одиночки, которые, как мы все знаем, являются ничем иным, как глобальными переменными. Не было бы замечательно включить глобальные переменные в Java и избавиться от Одиночек. PHP, JavaScript, Ruby и многие другие языки имеют их, почему Java нет? Посмотрите на этот код:

Затем, чтобы получить к нему доступ, нам нужно использовать:

Это Singleton. Видите, насколько многословен он? Мы можем просто заменить его глобальной переменной (я предлагаю использовать ключевое слово global).

And then:

user.getName();

Гораздо меньше кода нужно написать, и намного проще читать!

Для группировки статических методов мы создаем утилитарные классы, в которых необходимо определить приватные конструкторы, чтобы предотвратить их инстанциацию. Также нам приходится помнить, в каком конкретном утилитарном классе находится статический метод. Это только дополнительные хлопоты. Я предлагаю добавить глобальные функции в Java и дополнительные «пространства имён» для их группировки. Взгляните на этот утилитарный класс:

Теперь посмотрите на эту глобальную функцию с пространством имён:

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

Чтобы получить доступ к приватному атрибуту или методу объекта извне, мы должны использовать API отражения. Это не особо сложно, но требует написания нескольких строк кода, которые не так просто прочитать и понять.

Я предлагаю разрешить любому объекту получать доступ к любым атрибутам и методам другого объекта.

Конечно, если они являются приватными, компилятор выдаст предупреждение. Во время компиляции вы просто игнорируете предупреждение и продолжаете. Если вам действительно важна инкапсуляция, обратите внимание на предупреждение и сделайте что-то другое. Но в большинстве случаев программисты его игнорируют, так как они всё равно с удовольствием используют Reflection API.

Было бы удобно позволить нам вызывать конструкторы и методы с неполным набором аргументов. Аргументы, которые мы не предоставляем, по умолчанию будут установлены в null. Также, когда метод должен вернуть что-то, но нет оператора return, Java должна возвращать null. Это почти точно так работает в PHP, Ruby и многих других языках. Я считаю, что это была бы удобная функция и для разработчиков на Java.

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

Затем мы просто вызываем save(f) или save(f, "UTF-16"). Метод поймет, что мы имеем в виду. Мы также можем сделать это еще удобнее, как это сделано в Ruby, предоставляя аргументы метода по именам.

Также, когда нет ничего, что нужно вернуть, метод должен по умолчанию возвращать null. Запись return null просто является пустой строкой кода и не улучшает читаемость. Посмотрите:

Из этого кода очевидно, что если файл существует, метод загружает и возвращает его содержимое. Если же файла нет, он возвращает null, что будет хорошим индикатором для вызывающей стороны, что что-то не так и содержимое файла недоступно.

Я считаю, что это очевидно, что нам нужна эта функция: каждый приватный атрибут должен автоматически иметь сеттер и геттер. Не должно быть необходимости создавать их, Java предоставит их из коробки, также как и Kotlin и Ruby делают. В чем смысл иметь атрибут, если нет геттеров и сеттеров, чтобы его прочитать и изменить, верно?

С этой новой функцией нам больше не понадобится помощь Lombok или IntelliJ IDEA.

Может быть, мне стоит превратить свои идеи в официальные предложения для JCP. Что вы думаете?

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-05 at 22:24

sixnines availability badge   GitHub stars