2010-12-03

Java NG

В продолжение "хотелок" в Java.

Я считаю, что язык надо упрощать, а не усложнять (как это делает Scala).
Список пожеланий, что хотелось бы улучшить, добавить:
(в тексте [] используются для простого html == меньше больше)

1. добавить всё что есть в Project Coin: small language changes
много мелких синтаксических сахарков, делающих код более простым и наглядным.
В частности 'array getter/setter': v = myList[i]; mymap["key1"] = value == компилятор подставляет вызов get и put соответственно.
Если методов get/put/set не находится, то можно использовать любые другие проаннотированные @ArrayProperty


2. всё что есть в проекте Google Guava http://code.google.com/p/guava-libraries/
плюс статические и fallback методы у интерфейсов т.е. "перенос" максимум кода из статических методов в instance методы (mySet.filter(..), map1.transform, etc).
Пояснение про fallback: это статические методы в интерфейсе вида T filter (Set this, Filter _) - если у instance метода filter(Filter) нет,
то используется fallback метод из интерфейса.
myset.filter(myfilter).transform(myfunc) выглядит нагляднее и лучше работает с автокомплитом в отличии от transform(filter(myset, myfilter), myfunc)


3. возможность не писать ";" там где IDE и компилятор справятся без ; т.е. сделать точку с запятой более опциональной
Например: после и перед } , после )


4. простые замыкания (а не предлагаемый ужас), например: #{тело метода } или #(аргумент1, арг2, ){ тело } + именование параметров по умолчанию _ / _0, _1, _2, etc.
Последнее выражение в теле замыкания == return это выражение.
Также простое указание метода реализующего тело замыкания #this.имяМетода или #имяМетода или #другойОбъект.имяМетода (примеры ниже).

Примеры использования:

new Thread(#{log.info("hello!")}).start() == new Thread(new Runnable(){@Override public void run () { log.info("hello!"); }}).start()

mySet.filter(#{_ != null}) ==  mySet.filter(new Predicate[SomeType](){ @Override public void boolean apply (@Nullable SomeType _) { return _ != null; }});

vs текущее Iterables.filter(mySet, ....многобукв);

list.sort(#(a,b){a-b})  задание читателю ;-)

"ссылка на метод"
new Button("Нажми меня",    #myThisButtonClickListener) где в том же объекте объявлен реализующий тело интерфейса listener-а метод

public void myThisButtonClickListener (Button.ClickEvent event) {
    final Window subw = new Window("суб-окошечко");
    getMainWindow().addWindow(subw);
    ...
}

== new Button("Нажми меня",    #{myThisButtonClickListener(_)})

Многие уже сейчас реализуют это через reflection т.е. можно указать объект (this в данном случае) и имя метода в виде строки "myThisButtonClickListener"


5. конструкцию let[def/val/var], для тел методов, которая бы сама выводила тип переменной _в левую сторону_ vs текущая тенденция
выводить в правую (diamond operator и все эти Джошуа Блоковские static list, newMap и тд).
Пример использования.
let myvar = new ConcurrentHashMap[ТУТ БОЛЬШОЙ СПИСОК С Generics]()
final let s = "hello"
далее по коду работать с этими переменными как с обычными типизированными

for (let i : mybiggenericmap.entrySet()) {
  let k = i.key;
  for (let j = k; j<MAX; j++) {


6. авто свойства: если у класса есть getter getFoo(), то можно обращаться a = obj.foo, а если есть setter setFoo(T value), то obj.foo = v1. Внутри самого класса обращение к foo должно работать с переменной T foo, а this.foo - с getters/setter.
Автобилдеры?  myedit.width = 80, hight = 16, styleName = "sexy, main", value = 42;


7. массивы implements Iterable (можно будет применять filter, transform) и for работающий по Iterable/Iterator/Enumeration т.е. всеядный for, а не только массив и Iterable как сейчас.
Кроме того станут возможными унифицированные API: public double sum(Iterable collectionOrArray) .


8. полезные идеи из JavaFX (полный отказ от чистого JavaFX - это хорошо)
У JavaFX 2.0 очень трезвый и разумный roadmap http://javafx.com/roadmap/
Очень рекомендую на него поглядеть, много вкусного.

9. JRebel встроенный в JVM. JRebel хорошо, а out-of-box он бы imho дал такой синергетический эффект, что здорово бы улучшил индустрию.
Самый сильный козырь скриптовых языков быстрый цикл редактирование-тестирование в web, с JRebel этот козырь получили бы все языки JVM.



10. /regexp Pattern/ прямая поддержка в Java коде т.е. данная конструкция должна выглядеть как скомпилированный Pattern.



11. === безопасный вызов equals т.е.: a = b  - присваивание, a == b - сравнение ссылок и простых типов, left === b - сравнение объектов (и простых типов):  if (left == b) {  return true;  } if (left == null || b == null) { return false;  }  return left.equals(b);


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

4 комментария:

tonsky комментирует...

Fantom.org смотрели? Не все, но половина хотелок как минимум, плюс Actors вместо потоков.

Unknown комментирует...

Не смотрел, т.к. не видел чтобы его упоминали особо.
Какой-то он не майнстримный vs Clojure, Groovy, Scala...

Сами пользуетесь?

tonsky комментирует...

Ну мейнстримности в требованиях заявлено не было. fun4j поди тоже не шибко мейнстрим. Пользовать да, пытаемся, эффект сразу заметен (в производительности труда, ну да известно, любой язык лучше Джавы), камней пока не видно, а что будет дальше — покажет время.

Unknown комментирует...

Помимо языка, хорошо бы:
+ MiG Base64 включили в jre и везде его использовали и было бы одно супер быстрое публичное API для Base64

+ заменили тормозную XML либы на более быстрые. К примеру JAXEN для XPath заметно быстрее того, что в Jre, а woodstox самый быстрый XML парсер - заменить StAX парсер из JRE на него

+ грамотно купить команду JRebel и поставлять его в JRE out-of-box с грамотным публичным API для фреймворк писателей - все скриптописатели захлебнуться от желчи ;-)