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.
[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.
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…
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!
}
}