Agora com conhecimento de causa resolvi fazer uma comparação entre Java e .Net. Aproveitando as colocações de um
colega. Vamos fazer um Ping-Pong Java .Net.
Característica: Compilado para código nativo
Java: Raramente. O Java é quase sempre interpretado.
C#: Sempre compilado para código nativo. A compilação pode ser feita na instalação ou na primeira execução do programa.
Característica: Todos os tipos derivados de ancestral comum
Java: Sim, todos os tipos são derivados de object.
C#: Sim, todos os tipos são derivados de object.
Característica: “Boxing” e “Unboxing” - conversão de tipos por valor para tipos por referência
Java: Não. Exige conversão manual.
C#: Sim.
Característica: StructsJava: Sim e Não, pois este conceito é um tipo de patterns. Fica a disposição do desenvolvedor esta criação.
C#: Sim.
Característica: EnumJava: Não.
C#: Sim.
Característica: Passagem de parâmetros por referênciaJava: Sim, só não existe estas duas formas mencionadas, mas passa a quantidade de parâmetro que quiser. Obs, não existe a necessidade de ref. Ref. (limpo)
C#: Sim, de duas maneiras: ref para parâmetros de entrada e saída e out para parâmetro apenas de saída.
Característica: Propriedades
Java: Sim, existem os métodos Get/Set, se tiver utilizando o NetBeans a implementação fica mais rápida, é automática.
C#: Sim, diretamente. A criação de “componentes” é bastante facilitada.
Característica: Eventos e DelegatesJava: Não vejo como este delegate no Java mesmo, ainda mais tratando de função. Mas em Java existe a Inner Class que permite que os eventos sejam realizados com sucesso, alem existem a classe Action, que é exclusiva para este tipo de situação.
C#: Sim. Um “delegate” é um “ponteiro de função orientado a objetos”, permitindo a associação de um evento de uma classe ao código de outra de maneira conceitualmente simples e poderosa.
Característica: AtributosJava: Existem sim, básico este tipo de características.
C#: Sim, permitindo “etiquetar” o código com características que são interrogadas em tempo de execução através de “reflection”.
Característica: PonteirosJava: Não suportado diretamente, apenas indiretamente através de “referências”, principalmente para o Garbade collection ser mais efetivo.
C#: A princípio suporta referências, mas os ponteiros podem ser usados em código “inseguro” por questões de performance ou compatibilidade com DLLs, com isso a efetividade do Garbade collection não seja evetiva, necessário sempre destruir o Objeto.
Característica: Sobrecarga de operadores
Java: Sim.
C#: Sim.
Característica: Operadores de conversão
Java: Sim.
C#: Sim.
Característica: Operadores de cast
Java: Um, sintaxe semelhante ao C/C++, com a versão 5 é implícito.
C#: Dois, um semelhante ao C/C++ e o outro “as”. Um retorna null e outro dispara exception em casso de erro de conversão.
Característica: Inteiros sem sinalJava: Sim.
C#: Sim.
Característica: Tipo numérico pouco sujeito a erros de representação e arredondamento
Java: Sim.
C#: Sim, o tipo decimal pode ser usado em softwares que não toleram facilmente erros de arredondamento, como programas de contabilidade
Característica: For each: loop para varrer arrays e coleçõesJava: Sim (Patterns Interator, FOR com elements).
C#: Sim.
Característica: Campo readonlyJava: Não.
C#: Sim.
Característica: Documentação integrada em XMLJava: Sim, JavaDoc, Comentários etc.
C#: Sim, permitindo que o programador escreva facilmente a documentação enquanto programa. Este documentação pode depois ser extraída do fonte ou usada no próprio ambiente de desenvolvimento.
Característica: Switch com strings
Java: Não.
C#: Sim, facilitando o desenvolvimento.
Característica: Controle sobre “estouro de faixa” numéricaJava: Não, sempre será gerado uma exception, depois que estourar.
C#: Sim. As palavras reservadas checked e unchecked permitem mudar o que o programa faz quando há um “estouro de faixa numérica”: o checked dispara uma exception; o unchecked não.
Característica: Funções com número variável de parâmetrosJava: Não existem funções em Java, mas mesmo assim os métodos suportam sim..
C#: Sim, de forma “tipada”, com a palavra reservada params.
Característica: Formas do método Main
Java: Uma, só o necessário mesmo.
C#: Quatro. O main pode aceitar um array de strings ou nada; pode retornar inteiro ou nada.
Característica: Goto
Java: Não tem, ufa, mas é sim uma palavra reservada da Java.
C#: Sim, com a restrição de que não pode entrar em um bloco.
Característica: Arquivo “executável” independente do namespace
Java: Um “package” Java obrigatoriamente está associado a um único arquivo “.class”.
C#: Não existe relação direta entre o “namespace” e a DLL que o implementa, dando mais flexibilidade ao desenvolvedor na hora de quebrar seus projetos em pedaços menores.
Característica: Especificadores de acesso
Java: Quatro.
C#: Cinco. O internal, adicional, especifica acesso apenas no mesmo “assembly” (mesma DLL, a grosso modo).
Característica: Diretivas de compilação condicional (#ifdef etc)Java: Não.
C#: Sim.
Característica: DestrutoresJava: Não, mas o método Finalize pode ser usado, Garbage Collection é o grande mestre para este tipo de situação, o desenvolvedor não tem que se preocupar com este tipo de situação.
C#: Sim. E tem que sempre destruir, pois o Garbage Collection não é efetivo.
Característica: Padronização por algum organismo internacionalJava: Sim, JCP (http://jcp.org) Empresas que fazem parte do JCP, na intenção de padronização:
Mais empresas que estão envolvidas com a Java
J2SE e J2EE
Apache Software Foundation
BEA Systems
Borland
Fujitsu Limited
Google
Hewlett-Packard
IBM
Intel
Doug Lea
Nortel Networks
Oracle
Red Hat middleware LLC
SAP
SAS Institute Inc.
Hani Suleiman
Sun Microsystems
J2MEBenQ
Jean-Marie Dautelle
Ericsson AB
IBM
Intel
Motorola
Nokia
NTT DoCoMo
Orange France
Philips
Research In Motion
Samsung
Siemens
Sony-Ericsson
Sun Microsystems
Vodafone
C#: Sim. Submetido e aceito pelo ECMA (http://www.ecma.ch).
Característica: Chama APIs do Windows e DLLsJava: Não. Mesmo o suporte “nativo” de alguns compiladores é extremamente limitado pela falta de ponteiros na linguagem.
C#: Sim.
Característica: Chama objetos COM/COM+
Java: Realmente é meio limitado, mas falar que não tem é muito forte, pois existem algumas implementações no mercado que funciona (
http://j-integra.intrinsyc.com/support/com/doc/servlet_com/ServletToComPlusExample.html). Mas dizer que não tem é muito forte.
C#: Sim.
Característica: Cria objetos COM/COM+Java: Não.
C#: Sim.
Característica: Inspirado no C/C++Implementação: Boa parte da sintaxe de ambas as linguagens foi inspirada no C/C++, especialmente declaração de variáveis, funções e estruturas de controle.
Característica: Orientação a objetosImplementação: Ambas as linguagens suportam conceitos de programação orientada a objetos com a palavra reservada class.
Característica: HerançaImplementação: Herança simples de classes a partir de ancestral comum e herança múltipla de interfaces.
Característica: Gerenciamento de memóriaImplementação: Automático, com “coletor de lixo”.
Característica: Tipagem forteImplementação: Todas as atribuições tem os tipos validados. Os “casts” são sempre verificados em tempo de execução. Não é possível violar o sistema de tipos.
Característica: Compila para código intermediárioImplementação: Sim. No caso da Microsoft compila para “Intermediate Language” e no Java para “bytecode”.
Característica: Tratamento de erroImplementação: Exceptions, Mas o Visual Studio não critica se não implementar, NetBenas critica na hora e gera o refactory na hora da critica acertando o código.
Característica: ReflectionsImplementação: Ambas as linguagens suportam “reflections”.
Característica: UnicodeImplementação: Ambas as linguagens usam o padrão Unicode para representar caracteres e strings.
Característica: Classe que não pode ser herdada
Implementação: “final” em Java; “sealed” em C#.
Característica: Campo constante
Implementação: “static final” em Java; “const” em C#.
Característica: Operador que verifica compatibilidade de tipos
Implementação: “instanceof” em Java; “is” em C#.
Support technologiesDistribution protocol.Net: DCOM, SOAP
Java: RMI/IIOP/SOAP/Corba
Firewall.Net: ISA*
Java: JBOSS/GlassFish/Weblogic/Websphere
HTML page caching.Net: ISA*, ASP.NET
Java: Servlet/JSP
Presentation tier technologiesInfrastructure
.Net: IIS
Java: JBOSS/GlassFish/Weblogic/Websphere
Programming model.Net: ASP.NET
Java: Servlets, JSP
Middle tier technologiesInfrastructure:
.Net: COM+
Java: EJB, Corba,
Programming tool.Net: Visual Studio.NET
Java: NetBeans (Sun Open Source)/Eclipse (IBM Open Source)/JBuilder Borland(IBM)/Visualstudio/BlueJ/TextPed/JDeveloper (Oracle)
Security API.Net: COM+ Security Call Context
Java: JAAS/Java SE Security
Message Queue API.Net: MSMQ
Java: JMS 1.0
Asynchronous components.Net: Queued (COM+)
Java: Message driven beans (EJB 2.0 +)
Naming and Directory
.Net: ADSI
Java: JNDI
Data tier technologiesDistributed transaction
.Net: MS-DTC
Java: JTS
Relational DB API.Net: ADO.NET
Java: JDBC 2.0
Hierarchical DB API.Net: ADO.NET
Java: JDBC 2.0
Database storage.Net: SQLServer**
Java: Oracle/SQLService/MySql/Access/Firebird,HS LDB,IBMB2,mSQL,PostgreSQL,SQL-Server,TinySQL,ZODB
Mainframe DB connectivity.Net: HIS*
Java: Java Connectors
Scripts.Net: Silverlight
Java: JavaFX
Mobile.Net: Windows Mobile
Java: J2ME
Plataforma.Net: Windows
Java: Solaris, Windows, Linux, Unix