Melhorar codigo

Gostaria de receber umas dicas para melhorar este codigo. A classe tem o objetivo de criar Logs para o meu programa.

public class Log {

private static Log log;
private final static String PATH = FileSystemView.getFileSystemView().getHomeDirectory().getPath() + "/M4Cloud/Logs/";

static {
    log = new Log();
}

private Log() {
    verificarExiste();
}

public void logar(String texto) {
    System.out.println(texto);
    escreverLinha(texto);
}

private void escreverLinha(String texto) throws RuntimeException {
    DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
    Date hoje = new Date();
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(PATH + formatter.format(hoje) + ".txt"))) {
        bw.write("[" + new SimpleDateFormat("HH:mm:ss").format(hoje) + "] " + texto);
        bw.newLine();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

private void verificarExiste() {
    criarDiretorioLog();
    criarArquivoLog();
}

private void criarArquivoLog() {
    Date hoje = new Date();
    DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
    if (!new File(PATH + formatter.format(hoje) + ".txt").exists()) {
        escreverLinha("##CRIADO EM " + formatter.format(hoje) + " POR M4CLOUD##");
    }
}

private void criarDiretorioLog() {
    if (!new File(PATH).isDirectory()) {
        new File(PATH).mkdirs();
    }
}

public static Log getInstance() {
    return log;
}

}

Não vi tudo, mas de primeira creio que não seja necessário esse try catch. Se o compilador tiver exigindo, jogue no throws, por mais que assim ainda seja verboso, mas é o mundo Java.

Não fixe o diretório dessa forma, passe por parâmetro de alguma maneira.

Fora isso, se o seu programa for grande e ficar chamando esse método de escrita de log toda hora, ele vai virar um gargalo. Você pode usar uma fila sincronizada e deixar uma thread responsavel só por escrever o log, tirando o gargalo do disk write.

Tem algum motivo pelo qual nao o deva fazer, ou normalmente nao é feito assim?

Pode dar um exemplo simples disso?

Em que situações devo usar throws?

Infelizmente vejo muitos usando catch sem necessidade. Vai usar quando for fazer algo de útil dentro do catch para atender a funcionalidade.

Neste seu caso creio que precise apenas do try (…) { … } sem catch.

Sobre throws no método vai usar quando o compilador te obrigar, nada importante pra atender a funcionalidade, é por pura verbosidade do java.

1 curtida