Uma comparação segundo os princípios da Orientação à Objetos
Introdução à linguagem Java
HistóricoO Projeto Green
Um sistema para uso em produtos de consumo eletrônicos.
O C++ não funcionou e uma nova linguagem era necessária.
James Gosling, programador de rede assume o projeto.
O nome Java Inspirado em uma loja de café.
Introdução à linguagem Java
Padrão AbertoPadrão homologado internacionalmente
Aprovado pela ISO/IEC JTC-1. Implementações Java podem ser disponibilizadas por
terceiros para qualquer plataforma. Fidelidade e compatibilidade com a especificação
original é atestada em conjunto com a IBM e a Netscape.
O executável Java é compatível com qualquer implementação em qualquer plataforma, roda sem ter o códgo fonte recompilado.
Introdução à linguagem Java
Arquitetura
O Java roda sobre uma máquina virtual que abstrai particularidades da máquina hospedeira.
O código desta máquina virtual, chamado bytecode, é verificado antes de ser executado, evitando que seja corrompido em sua transferência.
Código fonte em Java
Compilador Java
CA FE BE 00 03 00 2D…
Estrutura básica de uma classe Java
Exemplopublic class Point2d {
int x, y;Point2d(int x, int y) {
this.x = x;this.y = y;
}Point2d() {
this(0,0);}double length() {
return Math.sqrt(x*x + y*y);}
}
Estrutura básica de uma classe Java
Visibilidade de atributos e operações
Estes são os modificadores de visibilidade para atributos e operações:
public - acesso a partir de todas as classes protected - acesso a partir de todas as classes filhas e
do mesmo pacote friendly - acesso a partir de classes do mesmo pacote
(não precisa ser declarado) private - acesso exclusivamente pela própria classe
Gerenciamento de memória
Garbage Collector
A alocação de memória é dinâmica Todos os objetos em Java são alocados
dinamicamente quando explicitamente solicitados. Não existem ponteiros em Java: o acesso aos objetos
é feito através de referências. O cálculo do espaço a ser alocado é de
responsabilidade exclusiva do compilador e o programador não pode nem precisa intervir.
Gerenciamento de memória
Garbage Collector
A liberação de memória alocada é automática Todas as referências a um determinado objeto são
contabilizadas pelo gerenciador de memória. Objetos que não tiverem referência são destruídos
automaticamente pelo “garbage collector”. Programadores não precisam se preocupar em
descartar explicitamente um objeto. Basta remover todas as suas referências.
Gerenciamento de memória
Garbage Collection
O gerenciamento de memória é feito através de procedimentos similares.
Influenciou o comportamento na linguagem Java.
Herança
Hierarquia de classes
Todas classes herdam implicitamente da classe Object (raiz)
A classe Object já tem implementações prontas de métodos que facilitam a implementação de novas classes.
Métodos como de serialização, construtor e representação em String já estão prontos e ainda podem ser redefinidos caso necessário.
Herança
Hierarquia de classes
Todas classes herdam implicitamente da classe GENERAL (raiz), de forma similar ao Java.
A EKLS (Eiffel Kernel Library Standard) define também outras outras 25 classes que provêem funcionalidades essenciais das quais o desenvolvedor pode herdar.
Herança e Interface
Heranças simples e múltipla
Java suporta apenas herança simples.
Para contornar a falta da herança múltipla ela usa interfaces, que só possuem as declarações dos métodos.
Uma classe pode implementar várias interfaces, possibilitando o uso de um certo tipo de “herança múltipla”, porém descartando os perigos da mesma.
Uma interface pode ser implementada em várias classes de hierarquias diferentes.
Herança e Interface
public class Point2d { int x, y; Point2d(int x, int y) { this.x = x; this.y = y; } Point2d() { this(0,0); } double length() { return Math.sqrt(x*x + y*y); }}
Exemplospublic class Point3d extends Point2d {
int z;
Point3d(int x, int y, int z) {
super(x,y);
this.z = z;
}
Point3d() {
this(0,0,0);
}
double length() {
return Math.sqrt(x*x + y*y + z*z);
}
}
Herança e Interface
interface Colored {
modifyColor(Color color);
Color getColor();
}
public class Line implements Colored {
…
}
Exemplospublic class Point3d extends Point2d implements Colored {
Color color;
…
modifyColor(Color color) {
this.color = color;
}
Color getColor() {
return this.color;
}
}Como implementam a
Interface, Point3d e Line são obrigadas a definir os
métodos declaradosna interface.
Herança e Interface
Exemplos
Desta forma, implementamos “herança múltipla”, sendo válidas as seguintes atribuições:
Colored colored = new Point3d();
Colored colored2 = new Line();
Ambas as referências só visualizam os métodos da interface.
Herança e Interface
Heranças simples e múltipla
Eiffel contém o melhor suporte nesta área, suportando herança simples, múltipla e repetida. (na qual uma classe desdende multiplamente de classes com ancestral comum)
Ele permite a seleção de quais atributos herdar duplamente ou não.
Além disso, também possui o conceito de interface, provendo encapsulamento e information hiding
Polimorfismo
Sobreposição de atributos e operaçõesEm Java, o que identifica unicamente o método é o nome e a lista de argumentos. Nas subclasses podemos ter:
Overloading - definição de métodos de mesmo nome com listas de argumentos diferentes.
Overriding - definição de métodos de mesmo nome e lista de atributos.
Na herança, sobreposições são tratadas de acordo com as referências que estão acessando as mesmas.
Java não suporta sobrecarga de operadores.
Polimorfismo
Sobreposição de atributos e operações
Eiffel, diferentemente do Java, não suporta sobrecarga de métodos, mas suporta mudança de nomes (renaming), no qual um método ancestral muda de nome para se adaptar semanticamente melhor ao novo contexto.
Eiffel suporta sobrecarga de operadores.
Associações
Agregação
Java e Eiffel não suportam agregações explicitamente.
O fazem através de uma simples referência a outro objeto.
Composição
Novamente não suportam explicitamente.
O fazem colocando uma classe dentro da outra ou passando uma referência de uma no construtor da outra.
Domínios de Classes
Pacotes do JDK - Core APIjava.lang - matemática e stringsjava.util - estrutura de dadosjava.io - entrada e saídajava.net - acesso à redejava.applet - interação com a Webjava.awt - interação com a GUIjava.math - matemática criptográficajava.beans - componentização
Domínios de Classes
Existem bibliotecas de classes escritas em Eiffel para todo tipo de aplicação de uso comum, sendo as principais distribuídas pela Eiffel Software junto com o EiffelStudio.
Além disso, Eiffel pode integrar-se com código C e classes em C++, de maneira que a disponibilidade de classes para uso em Eiffel é enorme.
Espaço-estado e comportamento
Invariantes, Pré-condições e Pós-condiçõesJava não provê suporte a invariantes, pré-condições ou pós-condições.
Desenho por Contrato : Eiffel provê suporte total a esse conceito de projeto de sistemas e o coloca como principal diferencial comparativo com outras linguagens
A Eiffel Software afirma que o desenho por contrato levado a sério pode reduzir os custos de depuração em até 95%
Componentes
JavaBeans
Um componente é um conjunto de objetos que partilham a mesma arquitetura JavaBean e cumprem um determinado contrato.
Os componentes JavaBeans devem atender a uma regra de formação de nomes e atender a certos chamados de métodos.
Componentes
Exemploclass Conta{
Double saldo;
Double getSaldo();{ return saldo; }
void setSaldo(Double quantia){ saldo = quantia; }}
class ContaBeanInfo{ /*.....*/}
Componentes
Eiffel por ser puramente OO suporta plenamente componentização
Exceções
Try e Catch
Em java há suporte para tratamento de exceções em tempo de execução através das diretivas "try" e "catch".
Todo método que invoca outro que declarativamente lança uma exceção é obrigado a tratar internamente a exceção sem deixá-la se propagar ou declarar que também lança a mesma exceção ou uma outra exceção que esteja acima na hierarquia da primeira.
Exceções
Exemplotry { c1.divide(c2);
}
catch(AritimethicException e) { System.out.println("Impossible division by zero.");}
Toda vez que uma exceção ocorre em um método e não é tratada, é passada para o escopo do método que invocou o primeiro.
Exceções
Uma exceção em Eiffel semanticamente indica “Quebra no Contrato", bastando que uma invariante, pré ou pós-condição de classe seja violada.
Comportamento imprevisto, intratável, no qual a única alternativa possível é tentar novamente (retry), ou falhar.
Exceções
Desenho por contrato + exceções : Funciona bem detectando erros durante o processo de desenvolvimento
Abordagem oposta ao Java: a exceção, ainda que seja um erro, não é um imprevisto, mas uma classe bem definida, fazendo parte do próprio desenho da aplicação. O foco da estrutura try-catch é o controle do fluxo do programa pós-exceção.
Top Related