hirthwork 13.08.2012 09:37 mcabberEDE6A3B7

поскольку в java@cjr сегодня редкостный тупняк, то просрусь потоком сознания
сюда (а для чего ещё был сделан псто?).
итак, допустим вы хуярите свой новый tee (просто для примера).
в главном объекте tee-ng у вас будет открыто не меньше двух output stream'ов,
куда вы собственно и будете срать тем про пришло в stdin. получив EOF, вы, как
честный джентельмен, должны будете оба этих стрима закрыть. в случае стримов с
буферизацией (а ведь для записи в файл, вы именно такие будете юзать), это
может реально закончиться фейлом (например, если на диске кончилось место и
буфер сбросить некуда). В C++03 это выльется в настоящий адпизды, ибо не
проебать инфу о каждом фейле в случае работы с эксепшенами у вас просто так не
получится. В Java6 та же самая хуйня, кстати.
В Java7 появлись три связанных понятия, облегчающих жизнь в данном конкретном
случае. Это try-with-resources (когда вначале try-блока можно указать ресурсы,
у которых в конце блока нужно вызвать close()), интерфейс AutoCloseable,
который должны имлементить объекты перечисленные в try-with-resources, и
suppressed exceptions, т.е. при возникновении эксепшена во время обработки
другого эксепшена, возникший эксепшн кладётся внутрь существующего, чтобы потом
показать в логе или ещё как обработать.
В итоге, при закрытии объекта, можно просто перечислить объекты которые нужно
закрыть в try-with-resources, а само тело блока оставить пустым и знать, что в
случае чего, для каждого объекта будет вызван close(), информация об ошибках
будет сохранена и будет кинут правильный эксепшен. Например:

public class Tee implements AutoCloseable, OutputStream {
public final OutputStream stdout;
public final OutputStream file;

// Streams initialization and operations delegation

@Override
public void close() throws IOException {
try (OutputStream stdoutGuard = stdout;
OutputStream fileGuard = file)
{
}
// stdout & file will be closed at this point
}
}

в данном решении меня лишь напрягает warning от -Xlint:
warning: [try] auto-closeable resource first is never referenced in body of corresponding try statement
поэтому перед close() приходится ещё писать аннотацию @SuppressWarnings("try"),
что напрягает.

буду благодарен, если кто-нибудь подскажет как избавить от столь гнусной
аннотации.
а ещё буду благодарен, если кто-нибудь подскажет нормальный способ в
конструкторе нормально хэндлить ситуацию, когда stdout создался нормально, а
при создании file, случился эксепшен. в этом случае приходится вызывать
stdout.close(), который опять же может кинуть эксепшен, и приходится его
вручную добавлять в suppressed exceptions. кажется, что тут должно быть что-то
более нативное и удобное

1. hirthwork 13.08.2012 09:38 mcabberEDE6A3B7

там, конечно, extends OutputStream, но всем похуй.

2. DZhon 13.08.2012 10:42

Еще немного и ты осознаешь, что даже сиране C# древней спецификации 2.0 вполне успешно справлялся с блочным захватом ресурсов (предусмотрено в синтаксисе).
http://java.dzone.com/articles/java-7-ne...

Do you really want to delete ?