|
The Java Specialists' Newsletter
Issue 080 2003-10-13
Category:
Language
Java version: Várias Classes Públicas em um Único Arquivoby Dr. Heinz M. Kabutz
Special Thank You!
I would like to thank Rafael Steil from the Grupo de Usuarios
Java - GUJ, from Brazil for translating our newsletters into Portuguese. In addition, I would like to
thank Vanessa Sabino for assisting Rafael in the translation work.
Disclaimer: Since I do not know any Portuguese, I make no warranty for the
accuracy of the translation. Heinz
Would you like to really understand Java concurrency? Join us for an
in-depth study of how threading works in Java. During the course,
you will learn how to write correct and fast multi-threaded Java code.
Please
click here if you would like to learn more. Várias Classes Públicas em um Único Arquivo
Algumas das reclamações mais comuns que eu ouço sobre Java são:
- Java é lento.
- Não é possível fazer um "exe".
- Cada classe Java precisa estar em um arquivo separado.
Algumas vezes tento levar estas reclamações a sério. Aqui estão minhas respostas padrão:
-
A velocidade de execução depende principalmente da habilidade do desenvolvedor. Eu já ouvi falar de aplicações reais em que a versão em Java era mais rápida do que a equivalente em C++. Para manipulação intensiva de números, provavelmente C++ será melhor, mas para aplicações gerais, as vantagens do Java superam a pequena redução de performance que pode acontecer.
-
Estão disponíveis vários compiladores que produzem arquivos "exe" a partir de classes Java, alguns bem poderosos. Em uma newsletter futura estamos planejando analisar alguns deles.
-
Normalmente minha resposta é que fica mais fácil controlar o código fonte quando você tem um arquivo separado para cada classe. Como descrito na newsletter "Once Upon an Oak", uma das razões para esta restrição é deixar mais rápido o processo de compilação. Porém, esta newsletter irá demonstrar uma abordagem em que você pode ter várias classes públicas em um único arquivo .java.
Antes de eu mostrar esta abordagem, fique claro que eu não aprovo que sejam escritas classes desta maneira. Eu prefiro usar um arquivo por classe, até mesmo para classes não públicas. Certa vez tive que trabalhar em uma classe que tinha por volta de cem inner classes. Foi um pesadelo.
Começaremos definindo o pacote com.maxoft.tjsn que contém a classe All. Esta classe contém todas as outras classes como inner classes public static.
package com.maxoft.tjsn;
public class All {
public static class A {
public void f() {}
}
public static class B {
public void g() {}
}
public static class C {
public void h() {}
}
public static class D extends A {
public void f() {}
}
public static class E {
public void jump() {}
}
public static class F {
private final E e = new E();
public void skip() {
e.jump();
}
}
}
É importante que a classe esteja dentro de um pacote, conforme veremos a seguir. Aqui mostramos a primeira abordagem de como poderíamos usar as classes A,B,C,etc.
import com.maxoft.tjsn.All;
public class AllTest1 {
public static void main(String[] args) {
All.A a = new All.A();
All.B b = new All.B();
All.C c = new All.C();
All.D d = new All.D();
All.E e = new All.E();
All.F f = new All.F();
}
}
Evidentemente, isto está horrível, entretanto, há outra abordagem. Nós podemos importar as inner classes diretamente, da seguinte forma:
import com.maxoft.tjsn.All.*;
public class AllTest2 {
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
D d = new D();
E e = new E();
F f = new F();
}
}
Agora está muito melhor do que dizer All.A e All.B. Acho que funciona apenas se as classe estiverem dentro de um pacote, mas isso não deve ser considerado uma restrição já que as classes deveriam estar em pacotes de qualquer forma.
Mas, prefira não fazer isso...
Aqui estão algumas razões de porque você deve evitar fazer isso: Em primeiro lugar, irá resultar em arquivos de código fonte muito grandes. Em segundo lugar, todos os membros das classes terão sua visibilidade afetada, podendo gerar um código macarrônico que deixaria uma mãe italiana orgulhosa. Em terceiro, a maioria das IDEs tem dificuldades para suportar isto corretamente. E em quarto, pelo que me lembro alguns compiladores não suportam a importação de inner classes.
Language Articles
Related Java Course
Discuss at The Java Specialist Club
|