Будни Java

Mar 01, 2014 06:02


Хочу, чтобы try блок был выражением.

final Foo foo = try {
  computeFoo();
} catch (SomeException e) {
  // handle the error
}

Можно обойтись возвратом Pair или смастерить свой Either, но без нормальной поддержки алгебраических типов все равно ведь ничего хорошего не выйдет.  А пока продолжаем писать в стиле

Foo foo;
try {
  foo = computeFoo();
} ( Read more... )

java, programming

Leave a comment

Comments 10

archaicos March 1 2014, 05:02:51 UTC
Если бы это был C++, то можно было бы хоть такое сделать:

http://ideone.com/ZJih3Q

Reply

soloviewoff March 1 2014, 23:13:21 UTC
Но тут константности у foo все равно нет.

Reply

archaicos March 1 2014, 23:20:03 UTC
В смысле? Чего не хватает?

Reply

soloviewoff March 1 2014, 23:22:57 UTC
foo можно присвоить несколько раз. А хочется, чтобы она (или он? foo это мальчик или девочка?) была одноприсваемая.

Reply


sassa_nf March 1 2014, 09:32:25 UTC
ну к выражению куча вопросов - это что, значение выражения и без return годится? Тогда и функции не нужно return заканчивать.

final пишется так:

Foo blah;
try {
blah = computeFoo();
}catch(Exception e){
// not blah
}

final Foo foo = blah;

В теле метода разница не очень ясна, а в конструкторе или static initializer имеет смысл.

Reply

soloviewoff March 1 2014, 23:18:00 UTC
Твой вопрос про return навел меня на мысли, что, похоже, в Java 6 уже можно сделать через лямбды то, что хочется, во вменяемо коротком виде.

final Foo foo = () -> {
try {
computeFoo();
} catch (SomeException e) {
// handle the error
}
}

Не компилировал, но по документации должно работать. С поправкой на возможную необходимость расстановки дополнительных final для переменных в outer scope. Ждем Java 6 в продакшне.

P.S. return там можно ставить, а можно и нет. Свобода-с.

Reply


Leave a comment

Up