Pull to refresh

Ява после извержения вулкана

Reading time 5 min
Views 5.5K
Какой-то саркастический работодатель попросил улучшить Яву, и, хотя, я не президент Индонезии, но, вот что накатал быстренько, чтобы случайно озадачиться на полдня. Мне хотелось бы вот так. Общий принцип — максимальное упрощение без потери логического контроля. Для сего, очевидно, нужно не только добавить в язык то, чего там не было, но и убрать из языка многое из того, что там было, продолжая добрую традицию Си--.


  1. Возможность вернуть более одного результата из функции.
  2. Дефолтные значения примитивных полей обязать объявлять явно. Модификатор «static» из языка убрать, в качестве static — дефолтный экземпляр, доступный по ссылке на типизированный null. Называть это всё «экземпляром по умолчанию». Возможность модификатора «abstract» для полей, что будет означать как невозможность создать экземпляр класса, так и необходимость задания дефолтного значения этого поля в потомке класса.
  3. Для «protected», «default» и «public» полей автогенерация сеттеров и геттеров компилятором, без автогенерации видимых сорцов, но с возможностью их перегрузки, «private» убрать из языка, поскольку «сами» поля все и так будут «private» без возможности перегрузки. Добавить «local» — об этом в пункте 8.
  4. Автогенерация public интерфейсов из всех «public» полей класса, а также новый тип protected и.д. интерфейсов из соответствующих модификатору полей. Типы классов сравниваются по хеш-коду, который будет сгенерирован именами поля, именами аргументов, типами и возвращаемыми значениями, поскольку вероятность совпадения всего этого незначительна и может быть обнаружена во время компиляции с предупреждениями.

    Таким образом, больше не нужен «interface» как таковой, только «class», «abstract» — лишь инструкция, запрещающая создание экземпляра. По поводу множественного наследования — в следующем пункте 5.
  5. Добавление правил слияния для «extends». Явно указывать предка для всех конфликтующих полей, которые будут неотличимы от методов, об этом в пункте 8. В результате, объект будет наследовать код и реализовывать все родительские типы. Типы, которые не полностью сохранились в результате мержа — просто исчезают из формальных предков, оставляя код, но создавая ошибку компиляции при попытке ненадлежащего использования объекта.
  6. Динамические типы. Темплейты как в Си, а не как женериксы в Java. Типизация не пострадает от этого, поскольку динамические типы не могут быть непосредственно использованы в сорцах, но могут использоваться во всех случаях, когда используются базовые типы или рефлексия или темплейты, в которых также не сложно организовать перепланировку расширением типа инстанса прямо runtime, сужение — запретить.
  7. Подметоды как в Паскале.
  8. Все методы это полноценные дефолтные экземляры внутренних классов и неотличимы от полей. Для этого конструктор класса вернет значение. Конструктор класса будет телом метода по умолчанию, который будет создан во время компиляции, в соответствии с пунктом 2 «экземпляры по умолчанию». Больше не понадобятся специальные ссылки на метод, как в Java 8. Ссылка на метод будет означать ссылку на объект.

    Вызов метода и создание временного объекта только для вызова внутреннего метода становятся идентичными, все это может быть оптимизировано компилятором как простой вызов метода. С другой стороны, создание «метода» оператором «new», для последующих манипуляций ссылкой на него, означает создание нового экземпляра «класса». Присвоение полю ссылки на функцию — прямо через имя метода без скобок, значения функции — со скобками и аргументами в них. Поля с модификатором «local» не сохраняются между вызовами методов.

    Все одинаковые методы с различными наборами аргументов обязать группировать в подкласс, чтобы неповадно было замусоривать внешний класс. Дефолтные поля такого подкласса становятся, соответственно, не абсолютно статичными, а статичными относительно внешнего класса. За исключением случая, когда сам внешний класс — дефолтный экземпляр.
  9. Вместо «try»-«catch» также методы, «throws» идентифицирует разрешённый тип вызывающего метода, «throw» делает goto на метод обработчика, срезая callstack, а сами методы-обработчики ничем не отличаются, возврат из них осуществляется в обычном порядке, но, так получается, что в один из предыдущих вызывающих методов. Соответственно, вызывается обработчик на ближайшем уровне иерархии, как это происходит с try-catch. Таким образом, чтобы в случае exception перескочить через некий код, следующий за неким методом, нужно этот код, с этим неким методом в начале, поместить в подметод-класс, в котором перегрузить нужные обработчики. Такой подход существенно укоротит длинноватые, мягко говоря, методы реальных проектов на Java.

    «finally» сделать довеском к методу в конце, чтобы без лишних скобок.
  10. Новый оператор для runtime шифрования всяких примитивов и массивов примитивных полей и String и сжатия их в памяти для последующего извлечения их с ключом доступа, оптом для всего экземпляра класса. Чтобы прямо хотелось распаковать-использовать-упаковать в одном методе, а не чесалась голова «как это лучше сделать».
  11. Массивам нужен контроль границ только во время записи, и я бы дал возможность читать напрямую из памяти без контроля границ массива. Таким образом, учитывая наличие System.arraycopy, контроль границ массива будет осуществляться без ущерба для производительности. Поскольку, большинство дополнительных вычислений чаще всего выполняются во время записи, и, по сравнению с ними, сама запись не занимает много времени.
  12. Предоставление дополнительной базовой альтернативы синхронизации блокировщиками — самый простой метод в классе Thread, который отправляет кастомные сообщение другим Thread, и метод, через который можно получить кастомные сообщения из других Thread. Кроме того, в методе «run» объекта Runnable, который передается в Thread, требовать явно вызывать метод, прерывающий поток, и, чтобы без этого была ошибка компиляции. Также, добавить метод, который запускает пользовательские события Runnable из других потоков, принимает-отправляет сообщения каждый раз после этого прерывания. Все это принципиально ничего не меняет, но упростит поточно-ориентированную разработку в 90% случаев. Особенно в тех случаях, когда разработка идет на скорую руку, а это большинство реальных случаев.
  13. Фактически, граф всех объектов в памяти всегда имеет только примитивные типы, массивы или null или ссылку на нечто нативное на всех своих вершинах. Будет очень полезен базовый инструмент, который может сохранять весь этот граф в любой текстовой форме. Большие массивы примитивов могут храниться отдельно, маленькие — закодировать inline. Плюс версия виртуальной машины и — поехали, такая структура может быть восстановлена ​​в памяти.
  14. Полезный инструмент для поиска любых объектов в графе объектов по заданным критериям с учетом модификаторов доступа, по типу простого SQL. Эта задача значительно упрощается с помощью пунктов 1…9. Таким инструментом можно не только упростить иерархию объектов, но и организовать различные тесты и контроль допустимых значений и попытаться догнать Пролог.
Tags:
Hubs:
0
Comments 103
Comments Comments 103

Articles