## Example Use Cases

Below are some example use case snippets from the examples.

    /**
     * Writes the value of the object to the file.
     *
     * @param value the value to write, cannot be {@code null}
     *
     * @throws UncheckedIOException if an error occurs writing the data
     */
    public void write(final Object value) {
        AppLogger.LOGGER.appVersion("ContentWriter", 1, 0, 0, "Beta1"); (1)
        Objects.requireNonNull(value, ErrorMessages.MESSAGES.nullParam("value")); (2)
        write(Objects.requireNonNull(value, ErrorMessages.MESSAGES.nullParam("value")).toString());
    }

    /**
     * Writes the value to the file.
     *
     * @param value the value to write, cannot be {@code null} or an {@linkplain String#isEmpty() empty string}.
     *
     * @throws UncheckedIOException if an error occurs writing the data
     */
    public void write(final String value) {
        AppLogger.LOGGER.appVersion("ContentWriter", 1, 0, 0, "Beta1");
        if (Objects.requireNonNull(value, ErrorMessages.MESSAGES.nullParam("value")).isEmpty()) {
            throw ErrorMessages.MESSAGES.invalidValue(value); (3)
        }
        try {
            synchronized (outputLock) {
                writer.write(value);
                writer.newLine();
                if (autoFlush) {
                    flush();
                }
            }
        } catch (IOException e) {
            throw ErrorMessages.MESSAGES.operationFailed(UncheckedIOException::new, e, "write"); (4)
        }
    }

    @Override
    public void close() {
        try {
            synchronized (outputLock) {
                writer.close();
            }
            AppLogger.LOGGER.tracef("ContentWriter %s was successfully closed.", this);
        } catch (Exception e) {
            throw ErrorMessages.MESSAGES.closeFailure(e, this);
        }
    }

    /**
     * Safely close this writer logging any errors that occur during closing.
     */
    public void safeClose() {
        try {
            synchronized (outputLock) {
                writer.close();
            }
            AppLogger.LOGGER.tracef("ContentWriter %s was successfully closed.", this);
        } catch (Exception e) {
            AppLogger.LOGGER.closeFailure(e, this); (5)
        }
    }

1 | Logs the application version. Note this uses the @Once annotation to indicate this should only be logged once regardless of which `write` method is used.
2 | The `ErrorMessages.nullParam()` returns a `java.lang.function.Supplier`. This allows the message to be lazily formatted only if the `value` is `null`.
3 | Throws a message if the `value` is an empty string.
4 | Uses a `java.lang.function.BiFunction` to create a new `UncheckedIOException` with the caught exception set as the cause.
5 | Logs the caught exception instead of throwing a new exception.