Rafael Benevides bio photo

Rafael Benevides

In a serious relationship with Software Development

Email Twitter Facebook Google+ LinkedIn Instagram Github Last.fm Youtube

É impressionante como projeto diferentes repetem os mesmos erros de programação Java. Entre eles o mais comum é encontrar códigos como o abaixo

public static String getDataAtualMensagem() {
        Date dataAtual = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dataAtual);
        String dia = (calendar.get(Calendar.DAY_OF_YEAR) < 10 ?
                      "0" + calendar.get(Calendar.DAY_OF_YEAR) :
                      String.valueOf(calendar.get(Calendar.DAY_OF_YEAR)));
        String mes = (calendar.get(Calendar.MONTH) < 10 ?
                      "0" + calendar.get(Calendar.MONTH) :
                      String.valueOf(calendar.get(Calendar.MONTH)));
        String ano = String.valueOf(calendar.get(Calendar.YEAR));
        String hora = (calendar.get(Calendar.HOUR_OF_DAY) < 10 ?
                       "0" + calendar.get(Calendar.HOUR_OF_DAY) :
                       String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)));
        String minuto = (calendar.get(Calendar.MINUTE) < 10 ?
                         "0" + calendar.get(Calendar.MINUTE) :
                         String.valueOf(calendar.get(Calendar.MINUTE)));
        String segundo = (calendar.get(Calendar.SECOND) < 10 ?
                          "0" + calendar.get(Calendar.SECOND) :
                          String.valueOf(calendar.get(Calendar.SECOND)));
        //YYYYMMDDhhmmss
        return ano + mes + dia + hora + minuto + segundo;
    }

Não vou entrar no mérito da origem deste código, mas percebam:

  1. São criados instâncias de Date e Calendar simultaneamente
  2. Existe um grande quantidade de comparações ternárias
  3. Vários objetos imutáveis do tipo String são criados
  4. Depois existe concatenação destas Strings

Eu já havia dito em um post anterior: Não invente uma funcionalidade que já existe em Java

Vejam como fica o código refatorado:

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMDDhhmmss");


    public static String getDataAtualMensagem() {
        return sdf.format(new Date());
    }

Os únicos objetos criados em toda chamada do método são o java.util.Date e o java.lang.String (que é retornado). Tirem suas conclusões sobre: Tempo de implementacão, performance e legibilidade!