Por que métodos estáticos privados?

62

Eu só queria esclarecer uma questão que tenho. Qual é o sentido de ter um método estático privado em oposição a um método normal com visibilidade privada?

Eu teria pensado que uma vantagem em ter um método estático é que ele pode ser chamado sem uma instância de uma classe, mas desde que sua privacidade existe até mesmo um ponto para ele ser estático?

A única razão pela qual consigo pensar é que isso ajuda conceitualmente a entender o método no nível da classe em oposição ao nível do objeto.

    
por Rehan Naqvi 01.04.2014 / 16:11
fonte

7 respostas

65

A característica de ser estático é independente da visibilidade.

As razões pelas quais você desejará ter um método estático (algum código que não depende de membros não estáticos) ainda serão úteis. Mas talvez você não queira que ninguém mais o use, apenas a sua turma.

    
por 01.04.2014 / 16:20
fonte
26

Um motivo bastante comum (em Java) seria inicializar variáveis de campo imutáveis em um construtor usando um método simples private static para reduzir a confusão do construtor.

  • É private : as classes externas não devem vê-lo.
  • É static : pode executar alguma operação, independente 1 do estado da classe de host.

Um exemplo um pouco inventado segue ...

por exemplo:

public class MyClass{
    private final String concatenated;

    public MyClass(String a, String b){
        concatenated = concat(a,b);
    }

    public String getConcatenated(){
       return concatenated;
    }

    /**
    *  Concatenates two Strings as 's1---s2'
    **/
    private static final String concat(String s1, String s2){
        return String.format("%s---%s", s1, s2);
    }
}

1 Assumindo que não há interação com outras variáveis static .

    
por 01.04.2014 / 17:14
fonte
12

Um caso de uso comum para um método private static é um método utilitário que é

  1. usado apenas por essa classe
  2. é independente do estado interno dessa classe
por 01.04.2014 / 18:46
fonte
10

Você vê que você tem algumas linhas de código que são repetidas em muitos dos seus métodos, então você decide extraí-los para um único método, já que o código duplicado não é bom.

Você torna o método privado, pois ele não é projetado para uso generalizado e você não deseja que um código não relacionado o chame. (Debate este ponto nos comentários….)

Como o método não acessa nenhum campo de instância, ele pode ficar estático, tornando-o estático e facilitando o entendimento e talvez até um pouco mais rápido.

Então .... (Talvez agora, talvez mais tarde, talvez nunca)

Uma vez que o método se tornou estático, é claro que ele pode ser movido para fora da classe, digamos para uma classe de unidade.

Também é fácil transformá-lo em um método de instância de um de seus parâmetros, geralmente é onde o código deve estar.

    
por 01.04.2014 / 18:17
fonte
2

Posso pensar em pelo menos dois motivos pelos quais você precisaria de um método privado estático em uma classe.

1: suas instâncias têm motivos para chamar um método estático que você não quer chamar diretamente, talvez porque ele compartilha dados entre todas as instâncias de sua classe.

2: Seus métodos estáticos públicos têm sub-rotinas que você não quer chamar diretamente. O método ainda é chamado sem uma instância, mas não diretamente.

É claro que "ajuda a classe a fazer sentido" é uma boa razão por si só.

    
por 01.04.2014 / 16:59
fonte
1

Geralmente, se eu descobrir que estou escrevendo métodos estáticos privados, considero isso uma indicação de que há algo que eu deveria ter modelado separadamente.

Como não estão vinculados ao estado de uma instância de objeto específica, uma coleção de métodos estáticos públicos e privados poderia formar uma classe totalmente separada com sua própria semântica & métodos não estáticos.

(Outra dica é que, se eu descobrir que tenho muitos métodos estáticos (públicos e privados) que possuem um parâmetro comum de algum tipo, eles podem ser melhores como membros desse tipo.)

Assim, para responder à sua pergunta, os métodos estáticos privados aparecem quando uma classe fornece um grupo de métodos relacionados que são independentes de uma instância dessa classe. (... e como eles são independentes, eles podem estar melhor em sua própria classe.)

    
por 01.04.2014 / 19:53
fonte
-1

Um exemplo muito simples que eu posso imaginar é, se você quiser fazer algum processamento em argumentos de entrada (ou alguma manipulação) que são passados para a função principal. Portanto, neste caso, se o processamento for grande e a mesma funcionalidade não for usada em nenhum outro lugar, fará sentido ter uma função privada, pois ela não será usada / chamada de nenhum outro lugar. + Estático como main é estático.

    
por 08.04.2014 / 07:57
fonte