Apenas um método em comum em todas as classes

15 respostas
S

Pessoal,

estou com uma dúvida, que inclusive postei no fórum de Java Básico, mas acho que aqui fica mais específico e visível. rsrs.

Tenho um método de centralizar JFrame, por exemplo. Quero que outras telas tenham esse mesmo método, mas não quero ter de escrever o mesmo método em todas as classes. Não posso usar herança nesse caso, porque é só um método que eu quero em comum em todas as outras classes, certo? Como faço isso? Um colega me deu a dica de usar interface. Como seria?

Detalhe: Estou usando VEP.

Desde já, agradeço.

15 Respostas

Rodrigo_Sasaki

Soruji:
Pessoal,

estou com uma dúvida, que inclusive postei no fórum de Java Básico, mas acho que aqui fica mais específico e visível. rsrs.

Tenho um método de centralizar JFrame, por exemplo. Quero que outras telas tenham esse mesmo método, mas não quero ter de escrever o mesmo método em todas as classes. Não posso usar herança nesse caso, porque é só um método que eu quero em comum em todas as outras classes, certo? Como faço isso? Um colega me deu a dica de usar interface. Como seria?

Detalhe: Estou usando VEP.

Desde já, agradeço.

Se você utilizar interface vai ter que implementar o método em todas as classes que quiser utilizar o método.

Não sei o seu caso, pois não conheço muito de Swing, mas pensando de modo geral, você poderia ter uma classe abstrata ao invés de interface, pois nela poderia implementar o método, mas lembre-se que em Java não existe herança múltipla, outra solução seria (se possível) fazer um método estático em uma classe utilitária.

J

Exemplo simples do uso de INTERFACES

//Vamos criar uma interface com o nome de Autenticavel onde teremos um método com o nome de autenticacao que será usado por uma classe para fazer a autenticação de um usuário através da senha informada…

public interface Autenticavel {
public boolean autenticacao(String senha);

//Obs: Observe que na minha interface tenho apenas a declaração de um método e não a sua implementação ficando a responsabilidade da implementação conforme a sua necessidade para a classe que for utilizá-la…

//Vamos criar uma classe com o nome de TesteAutenticacao que implementará (“implements”) a interface criada e será utilizada para o teste desse nosso exemplo…

public class TesteAutenticacao implements Autenticavel {
private String senha = “a1b2c3d4e5”;

public boolean autenticacao(String senha) {
	if (this.senha == senha) {
		System.out.println("Acesso autorizado!");
		return true;
	}

	else {
		System.out.println("Acesso negado!");
		return false;
	}

}

public static void main(String[] args) {
	TesteAutenticacao teste1 = new TesteAutenticacao();
	teste1.autenticacao("12345");

}

}

Bom é basicamente isso ai! Espero ter ajudado!!!

lucas_guj

Se o método é comum a todas as classes por que não utiliza como um metodo estatico?

E

Eu costumo, em vez de forçar a amizade (usando herança ou o escambau), criar um pacote utilitário (digamos br.com.exemplo.util.gui) e deixar lá todas as classes que acabo reusando no projeto.
Nesse caso, o método de centralização de um JFrame é um método estático.

Como são relativamente poucas, acabo não justificando criar um jar só para isso.

É que se você não usar a herança (herdando de “JFrameCentralizado”) você acaba tendo de forçar a reimplementação de um mesmo método só porque você resolveu criar uma interface “Centralizado” e forçar que seu JFrame implemente essa interface - um problema sério do Java que foi consertado no Scala e outras linguagens que aceitam uma implementação default de uma interface, ou “mixins”.

No Java 8 iremos ter uma solução parcial desse problema (implementação default de uma interface), mas enquanto isso não está fechado, prefiro, no initComponents ou no método que o VEP, WindowBuilder ou o editor gráfico de sua preferência, chamar manualmente esse método de centralização de JFrame que incluo em alguma das classes utilitárias.

lucas_guj

entanglement:
Soruji:

Tenho um método de centralizar JFrame, por exemplo. Quero que outras telas tenham esse mesmo método, mas não quero ter de escrever o mesmo método em todas as classes.

Eu costumo, em vez de forçar a amizade (usando herança ou o escambau), criar um pacote utilitário (digamos br.com.exemplo.util.gui) e deixar lá todas as classes que acabo reusando no projeto.
Nesse caso, o método de centralização de um JFrame é um método estático.

Como são relativamente poucas, acabo não justificando criar um jar só para isso.

É que se você não usar a herança (herdando de “JFrameCentralizado”) você acaba tendo de forçar a reimplementação de um mesmo método só porque você resolveu criar uma interface “Centralizado” e forçar que seu JFrame implemente essa interface - um problema sério do Java que foi consertado no Scala e outras linguagens que aceitam uma implementação default de uma interface, ou “mixins”.

No Java 8 iremos ter uma solução parcial desse problema (implementação default de uma interface), mas enquanto isso não está fechado, prefiro, no initComponents ou no método que o VEP, WindowBuilder ou o editor gráfico de sua preferência, chamar manualmente esse método de centralização de JFrame que incluo em alguma das classes utilitárias.

Quer dizer que tipo, você faz uma classe nesse pacote( ou mais de uma classe ) com métodos que vão ser utilizados em outra classe? Tipo centralizar JFrame. Que outros exemplos de métodos voce poderia dar?( Gostei disso que você falou, por isso estou perguntando, pois acho que pode ser uma boa. ) E como e quando você acha que esse determinado método vai servir em outros projetos e resolve guarda-lo?

KamikazeBr

Será que eu entendi errado?

Método pra centralizar JFrame já nao existe?

setLocationRelativeTo(null);

Espero que não seja somente isso.

Ate++

Rodrigo_Sasaki

Sim, classes como StringUtils da apache.commons.lang, ou CollectionUtils… que possuem métodos estáticos que facilitam sua vida sem prejudicar o desenho do seu sistema, com heranças e composições que simplesmente não fazem sentido.

E

Em projetos GUI, sempre você precisa das seguintes coisas:

Métodos estáticos

  • Centralizar um JFrame ou JDialog
  • Configurar um JDialog para sair com a tecla ESC

Classes

  • JTextField que aceita apenas dados monetários
  • JTextField que aceita apenas CPF e / ou CNPJ

Há alguns exemplos dessas coisas no projeto BrUtils, se não me engano (o autor original. F. Meyer, está um pouco sumido :slight_smile: )

lucas_guj

Sim, classes como StringUtils da apache.commons.lang, ou CollectionUtils… que possuem métodos estáticos que facilitam sua vida sem prejudicar o desenho do seu sistema, com heranças e composições que simplesmente não fazem sentido.

Entendi. Mais no caso todos os métodos vão ser estáticos?

Rodrigo_Sasaki

KamikazeBr:
Será que eu entendi errado?

Método pra centralizar JFrame já nao existe?

setLocationRelativeTo(null);

Espero que não seja somente isso.

Ate++


Acredito que seja isso mesmo…
mas eu particularmente prefiro ter um método estático com um nome “amigável” do que usar esse código toda vez. Legibilidade do código é importante.

S
digaoneves:
KamikazeBr:
Será que eu entendi errado?

Método pra centralizar JFrame já nao existe?

setLocationRelativeTo(null);

Espero que não seja somente isso.

Ate++


Acredito que seja isso mesmo..
mas eu particularmente prefiro ter um método estático com um nome "amigável" do que usar esse código toda vez. Legibilidade do código é importante.

Seria assim, então?

public class Func {

static void meuMetodo()
{
// Aqui coloco o código pra centralizar (ou outro método)
}

}

Aí eu conseguiria setar esse método numa outra classe:

public class janela extends JFrame {

public janela() {

super ();

static meuMetodo();

}

public static void main(String[]args){
janela app = new janela();
app.setVisible(true);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Seria mais ou menos isso?

Rodrigo_Sasaki
package br.com.utils.gui

public class FrameUtils(){

    public static void centerFrame(JFrame frame){
        //Código para centralizar o frame.
    }

}
mais ou menos assim, deu pra entender? Aí sempre que quiser centralizar um Frame usa:
JFrame frame = new JFrame();
FrameUtils.centerFrame(frame);
Não sei se é assim que se instancia um JFrame, mas a idéia básica de uma classe utilitária é essa.
S

Estou ficando confuso porque não sei se uso classe utilitária, interface ou método estático. rsrs.

Só queria saber se tinha como fazer isso apenas chamando o método de outra classe, sem ter de implementar, nem nada. Só pegar “emprestado” o método. rsrs.

Mas não estou conseguindo ver uma solução para essa questão.

Rodrigo_Sasaki

Soruji:
Estou ficando confuso porque não sei se uso classe utilitária, interface ou método estático. rsrs.

Só queria saber se tinha como fazer isso apenas chamando o método de outra classe, sem ter de implementar, nem nada. Só pegar “emprestado” o método. rsrs.

Mas não estou conseguindo ver uma solução para essa questão.

E uma classe utilitária não faz exatamente isso que você quer ?

KamikazeBr

digaoneves:
KamikazeBr:
Será que eu entendi errado?

Método pra centralizar JFrame já nao existe?

setLocationRelativeTo(null);

Espero que não seja somente isso.

Ate++


Acredito que seja isso mesmo…
mas eu particularmente prefiro ter um método estático com um nome “amigável” do que usar esse código toda vez. Legibilidade do código é importante.

+1

Criado 18 de maio de 2012
Ultima resposta 18 de mai. de 2012
Respostas 15
Participantes 6