Pergunta

Esta questão já tem uma resposta aqui:

O que você acha sobre o uso de métodos estáticos privada ?

Pessoalmente, eu prefiro utilizar um estática método privado para non-static , desde que ele não requer acesso a quaisquer campos de instância.

Mas ouvi dizer que esta prática viola os princípios OOP.

Edit:. Eu estou querendo saber de estilo de vista prospectivo, não o desempenho

Foi útil?

Solução

Um método private static por si só não viola OOP per se, mas quando você tem um monte desses métodos em uma classe que não precisa (e não pode *) campos de instância de acesso, você não está programando de forma OO, porque "objeto" implica estado + operações naquele estado definido em conjunto. Por que você está colocando esses métodos nessa classe, se eles não precisam de qualquer estado?

(*) = Em princípio, devido à visibilidade nível de classe em Java, um método estático em uma classe tem acesso aos campos de instância de um objeto dessa classe, por exemplo:

class Test
{
  int field = 123;

  private static void accessInstance(Test test)
  {
    System.out.println(test.field);
  }
}

Você precisa passar na referência a uma instância (ponteiro this)-se claro, mas, em seguida, que são essencialmente imitando os métodos de instância. Apenas mencionando isso para ser completo.

Outras dicas

Como mencionado acima, métodos estáticos privados são muitas vezes úteis para organizar lógica re-utilizado e redução / eliminação de código repetido. Eu estou surpreso que eu não ter notado qualquer menção de desempenho nesta discussão. De Renaud Waldura de 'a palavra final sobre Final':

(Note, métodos estáticos privados são implicitamente final)

"Uma vez que um método final somente é implementado na classe declarando, não há necessidade de enviar dinamicamente uma chamada para um método final, e invocação estática pode ser usado em seu lugar. O compilador pode emitir uma chamada direta para o método, ignorando inteiramente o procedimento de invocação de método virtual comum. por isso, métodos finais também são candidatos para inlining por um compilador Just-In-Time ou uma ferramenta de otimização similar. (Lembre-se, métodos privados / estáticos já estão final, portanto, sempre considerado para essa otimização .) "

Confira todo o documento: http://renaud.waldura.com/ doc / java / Final-keyword.shtml

privado ou público não faz diferença - métodos estáticos são OK, mas se você achar que você está usando-os o tempo todo (e de métodos de instância curso que não acessam quaisquer campos de instância são métodos basicamente estáticos para este propósito), então você provavelmente terá de repensar o design. Nem sempre é possível, mas a maioria dos métodos de tempo deve residir com os dados que operam em -. Essa é a idéia básica de OOP

Eu não necessariamente vejo nenhum problema real com o que você está fazendo, mas a minha primeira pergunta seria se o método não requer acesso a quaisquer campos de instância, então o que ele está fazendo nessa classe em primeiro lugar?

É uma questão de gosto, mas eu faço métodos que não reagem a um estado dentro do objeto estático. Desta forma, eu não tenho que reescrever código se uma função estática precisa de uma funcionalidade semelhante. A função de classificação seria um bom exemplo de tal caso a.

Eu não tendem a usar métodos estáticos privados. Eu usar métodos estáticos públicos e agrupá-los em classes Util para promover a reutilização.

métodos estáticos privados podem, por exemplo, operar em membros estáticos privados de sua classe. Isto pode ser utilizado para encapsular e operações certa classe específicos unificar.

A principal desvantagem do uso de métodos estáticos na minha opinião é o fato de que um joga fora a possibilidade de substituição. Como as classes em Java não são como, digamos, aulas de Smalltalk, você não pode substituir métodos estáticos.

Desde a sua pergunta se refere a métodos estáticos privados, substituindo está fora de opção de qualquer maneira.

I tendem a usar métodos estáticos apenas em caso de classes de utilitários (como java.lang.Math) ou padrões como o padrão Singleton. Todos estes necessitam de uma maior visibilidade do que privada, porque eles representam serviços prestados por sua classe para os outros.

final pensei: Se você tiver um ou mais particulares métodos estáticos, pense sobre como extrair-los para uma classe de utilitário dedicado e torná-los públicos. Mesmo melhor, torná-los métodos de instância e usar o padrão Singleton.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top