2
respostas

Método estático para criar instâncias

Estou revisitando alguns cursos de Java para relembrar alguns conceitos e me dei com uma questão. Métodos estáticos pertencem á uma classe e não possui qualquer relação com os atributos de instância. É estranho a gente pensar em criar um builder de instância dessa classe, recebendo no parâmetro do método estático os atributos? Algo como o exemplo abaixo...

public class Conta {
    private int agencia;
    private int numero;
    private double saldo;
    private DateTime dataCriacao;

    public Conta(int agencia, int numero) {
        this.agencia = agencia;
        this.numero = numero;
    }

    // getter and setters

    public static Conta buildConta(int agencia, int numero) {
        return new Conta(agencia, numero);
    }
}    
2 respostas

Par mim é estranho por não conseguir entender a funcionalidade, pois quando utilizo métodos estáticos, normalmente é em classe de apoio. Caso a intenção seja na confecção de testes acredito que trabalhar com objetos Mocks seja a melhor opção. Aqui na alura tem o curso de testes com mock (https://cursos.alura.com.br/course/mock) que ajuda bastante a entender a utilização desta ferramenta para os testes.

Exemplo de como utilizo os métodos estáticos em classes de apoio:

public class TratamentoDeDatas {

    private static final String ANO_MES_DIA_COM_HORA_COMPLETA = "yyyy-MM-dd HH:mm:ss";
    private static final String DIA_MES_ANO_COM_HORA_ZERADA = "dd/MM/yyyy 00:00:00";
    private static final String PERIODO = "yyyyMMdd";
    private static final String DIA_MES_ANO_COM_HORA_COMPLETA = "dd/MM/yyyy HH:mm:ss";


    public static String getDataAtualIndice(){
        return getDataAtual()+" - ";
    }

    public static String getDataAtual(){
        SimpleDateFormat sdf = new SimpleDateFormat(DIA_MES_ANO_COM_HORA_COMPLETA);
        GregorianCalendar gregCalendar = new GregorianCalendar();

        return sdf.format(gregCalendar.getTime());
    }

    public static String getPeriodoHoje(){
        SimpleDateFormat sdf = new SimpleDateFormat(PERIODO);
        Calendar agora = Calendar.getInstance();
        return sdf.format(agora.getTime());
    }

    public static String getDataRetroativa(int intervalo) {
        SimpleDateFormat sdf = new SimpleDateFormat(DIA_MES_ANO_COM_HORA_ZERADA);
        Calendar agora = Calendar.getInstance();
        System.out.println("Agora :"+sdf.format(agora.getTime()));
        agora.add(Calendar.DAY_OF_MONTH, -intervalo);
        System.out.println(intervalo+" dias atras :"+sdf.format(agora.getTime()));

        return sdf.format(agora.getTime());
    }
}

Eu entendi e geralmente eu vejo classes estáticas para fazer parse, ou tratar datas ou coisas do tipo... mas queria saber porque não é interessante a gente não usar um método estático para retornar uma instância de uma classe passando parâmetros pra ela... digo, qual a desvantagem de fazer isso.