Как, если еще можно заменить на Optional.orElse в GZIPWrapper? - PullRequest
0 голосов
/ 30 октября 2018

Привет всем работающим с gzip, у меня возник вопрос. У меня есть GzipWrapper и есть много, если еще, возможно ли сделать что-то подобное с Optional.orElse? С простыми дополнительными примерами я разобрался, но я не совсем понимаю, как это сделать в обертке. Пример по одному из методов будет достаточно) Заранее спасибо)

MyWrapper:

public class GZIPFilterResponseWrapper extends HttpServletResponseWrapper implements Closeable {

    private PrintWriter printWriter;
    private GZIPFilterResponseStream gzipStream;
    private ServletOutputStream outputStream;

    public GZIPFilterResponseWrapper(HttpServletResponse response) throws IOException {
        super(response);
        response.addHeader(CONTENT_ENCODING, GZIP);
        gzipStream = new GZIPFilterResponseStream(response.getOutputStream());
    }

    @Override
    public void flushBuffer() throws IOException {
        if (nonNull(printWriter)) {
            printWriter.flush();
        }
        if (nonNull(outputStream)) {
            outputStream.flush();
        }
        super.flushBuffer();
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        if (nonNull(printWriter)) {
            throw new IllegalStateException(GZIP_CANNOT_WRITE);
        }
        if (isNull(outputStream)) {
            outputStream = gzipStream;
        }
        return outputStream;
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        if (nonNull(outputStream)) {
            throw new IllegalStateException(GZIP_WRITER_ALREADY_HAS_CALLING);
        }
        if (isNull(printWriter)) {
            printWriter = new PrintWriter(new OutputStreamWriter(gzipStream, getResponse().getCharacterEncoding()));
        }
        return printWriter;
    }

    @Override
    public void close() throws IOException {
        if (nonNull(printWriter)) {
            printWriter.close();
        }
        if (nonNull(outputStream)) {
            try {
                outputStream.close();
            } catch (IOException e) {
                throw new IOException(e.getMessage());
            }
        }
    }
}

1 Ответ

0 голосов
/ 30 октября 2018

Optional не является заменой условной логики.

Optional был добавлен для того, чтобы API имел согласованный способ объявления о том, что метод возвращает значение, которое может присутствовать или не присутствовать, без возврата null. Возвращение null уязвимо для исключений, и нет простого способа узнать, стоит ли ожидать null без чтения документации. Optional делает этот контракт явным.

Так что, хотя возможно заменить вашу условную логику на Optional s, вряд ли ваш код станет лучше или легче для чтения.


Вот один пример, чтобы удовлетворить ваше любопытство:

if (nonNull(printWriter)) {
    printWriter.flush();
}

становится

Optional.ofNullable(printWriter).ifPresent(PrintWriter::flush);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...