Classes abstratas com métodos estáticos, alguém contra?

Galera queria uma opinião de avançados sobre este tipo de implementação :

Estou usando Classe abstrata com métodos estáticos tipo:

Declarei uma classe geral Library e dentro dela declaro vários métodos estáticos de uso comum por todas outras classes, operações com strings, criptrogafia, varias funções de modo geral.

public abstract class Library {
    
    
   public static String criptografa (String value) {
                  ///// implementações
   }

  public static int pos(String str, char value){
                  ///// implementações
   }


 public static String mid(String str, int pos){
                  ///// implementações
   }

 public static String left(String str, int pos){
                  ///// implementações
   }

 public static String right(String str, int pos){
                  ///// implementações
   }

Alguém poderia me dizer se isso não é uma boa forma de programação em Java, posso ter problemas futuros ?? , se isso não é certo, não é boa engenharia de software???, alguma opinião , sugestão.

Obrigado.

[quote=Yunki]Galera queria uma opinião de avançados sobre este tipo de implementação :

Estou usando Classe abstrata com métodos estáticos tipo:

Declarei uma classe geral Library e dentro dela declaro vários métodos estáticos de uso comum por todas outras classes, operações com strings, criptrogafia, varias funções de modo geral.

public abstract class Library {
    
    
   public static String criptografa (String value) {
                  ///// implementações
   }

  public static int pos(String str, char value){
                  ///// implementações
   }


 public static String mid(String str, int pos){
                  ///// implementações
   }

 public static String left(String str, int pos){
                  ///// implementações
   }

 public static String right(String str, int pos){
                  ///// implementações
   }

Alguém poderia me dizer se isso não é uma boa forma de programação em Java, posso ter problemas futuros ?? , se isso não é certo, não é boa engenharia de software???, alguma opinião , sugestão.

Obrigado.
[/quote]

Bom, eu não sou avançado mais vou dar os meus palpites! hehehe

Eu não entendi pq vc criou essa classe como abstract, não vi nenhuma necessidade para isso. Pelo que eu entendi essa é uma classe estilo aquelas Util que se encontram nos projetos, onde vc quer concentrar os métodos úteis do projeto mas que não fazem parte da regra de negócios(tipo verificar se é null, validar alguma coisa etc). Se for esse o objetivo dessa classe, acho mais interessante vc cria-la como final para ninguem extende-la e deixar o construtor dela como private, assim ninguem pode instancia-la tbm. Daí a unica forma de utiliza-la é chamando seus métodos static…

Quanto a ter métodos static em classes abstract não há nenhum problema que eu saiba. Só neste seu exemplo não caiu bem, se o seu objetivo é o que eu descrevi acima…

É o objetivo é esse mesmo q vc descreveu, como uma espécie de classe útil mesmo ,coloquei como abstract para poder evitar q fosse extendidae nem instancia-la(editando).Assim poderia usa um import static em qualquer classe, utilizar o metodo sem precisar qualificar.

abstratic é pra que nao seja instaciada…
tira o abstratic e marque como final…

com o final você vai garantir que ninguem estenda ela…

[]'s
Geraldo

Ah, blz vou colocar como final e o construtor como private, creio fica ok dessa forma.
Obrigado

pra que você quer uma classe que nao pode ser estendida nem instanciada?

nao entendi…

obs: abstract + final nao pode ser usados juntos pq um contradiz o outro…

[]'s
Geraldo

Bom o objetivo era o descrito logo acima, a utilização era apenas para metodos genericos como manipulação de strings e outros recursos gerais q auxiliam outras classes, queria reunir tudo numa lib. coloquei abstract para evitar ser instanciada. Exemplo: numa action q atentica um usuário, eu utilizo um metodo estático desta classe library, q faz a cripotgrafia da senha de entrada para comparar com a gravado no banco.

Vou utilizar assim :

public final class Library {
    
  private Library() {
      
  }  

[quote=Yunki]Bom o objetivo era o descrito logo acima, a utilização era apenas para metodos genericos como manipulação de strings e outros recursos gerais q auxiliam outras classes, queria reunir tudo numa lib. coloquei abstract para evitar ser instanciada. Exemplo: numa action q atentica um usuário, eu utilizo um metodo estático desta classe library, q faz a cripotgrafia da senha de entrada para comparar com a gravado no banco.

Vou utilizar assim :

[code]
public final class Library {

private Library() {

}
[/code][/quote]

ahhh ta… pq em mais em cima vc disse que queria que ninguem estendesse ela e nem instanciava… mas entao vai poder instanciar…
blz…

[]'s
Geraldo

Não , pelo contrário a idéia é não instancia-la e nem extende-la, so usar os métodos de auxilio.

[quote=Yunki]Ah, blz vou colocar como final e o construtor como private, creio fica ok dessa forma.
Obrigado[/quote]

É, pra esse seu caso essa é a melhor forma mesmo!

Valeu!

pra que você quer uma classe que nao pode ser estendida nem instanciada?

nao entendi…

obs: abstract + final nao pode ser usados juntos pq um contradiz o outro…

[]'s
Geraldo[/quote]

A classe dele só terá métodos de classe(static), que podem ser chamados sem uma instância da classe. Tipo os método abs da classe Math por exemplo.

Esses exemplos que vc deu me soaram meio estranhos - uma boa parte deles ja eh metodo estatico (ou de instancia) em algum outro lugar.

Ja deu uma olhada no Commons-Lang?

Agora, vamos supor que seu objetivo fosse outro e você estivesse tentato a ter métodos estáticos em sua classe abstrata.

O importante é lembrar que métodos estáticos não fazem polimorfismo. Mas o Java (numa decisão um tanto questionável) decidiu que é possível fazer shadowing desses métodos.

Ou seja, é possível criar um método estático na classe filha com a mesma assinatura de um método da classe pai. E isso pode ter consequências desastrosas, especialmente se você estiver usando o método estático através de uma chamada a um objeto. Por exemplo:

[code]public class Pai {
public static void doSomething() {
System.out.println(“A”);
}
}

public class Filha extends Pai {
public static void doSomething() {
System.out.println(“B”);
}
}

public class Teste {
public static void main(String args[]) {
Filha f = new Filha();
Pai p = f;
f.doSomething(); //Imprime “B”, como esperado.
p.doSomething(); //Imprime “A”, não houve polimorfismo!
}
}[/code]

Por isso, o ideal com métodos estáticos é chama-los diretamente da classe. Haveria menos confusão se o código fosse assim.

public class Teste { public static void main(String args[]) { Filha.doSomething(); //Imprime "B", como esperado. Pai.doSomething(); //Imprime "A", não houve polimorfismo! } }

Aproveitando para dar também meu palpite, seria muito melhor se fossem criadas classes menores, separadas pelo “serviço” que realizam. Exemplos:

antes:

  • Library.java

depois:

  • CriptoUtils.java
  • StringUtils.java
  • NumberUtils.java
  • etc.e.tal.java

E muito importante também: como disse um colega acima, sempre verifique se já não existe algo pronto que faz o que vc precisa.