Por que o C # tem muito mais recursos que o Java? [fechadas]

14

Observe que isso não pretende ser um argumento Java vs. C #. Sou um programador Java sem experiência em C #, pedindo apenas por curiosidade.

Eu fiz algumas leituras em C #, e parece que tem muito mais recursos do que Java. Vários exemplos:

  • Inferência de tipo.
  • dynamic palavra-chave
  • Delegados.
  • Parâmetros opcionais.
  • Lambda e LINQ (na verdade, não tenho idéia do que são).
  • Propriedades.

No entanto, o Java realmente não apresenta nada que o C # não possua.

Minha pergunta é: por que o C # tem muito mais recursos nativos que o Java? E por que o Java não adicionou alguns deles ao longo dos anos, por exemplo, Propriedades ou inferência de tipo? Os designers da linguagem Java adotam uma abordagem mais simplista? Qual é a razão para isto?

Aviv Cohn
fonte
2
@Patrick - Isso é um recurso - ou um detalhe de implementação?
Pete
14
Resposta tendenciosa: porque a equipe de design do C # sabe o que está fazendo. Resposta mais razoável: O C # foi projetado com o conhecimento das falhas do Java e sem o dogmático "apenas OO puro" (que eles nem atingiram). Metade desses recursos foram importados em massa do Lisp e Haskell, duas linguagens que o Java recusou firmemente a se inspirar até o java 8, e as outras são melhorias de sanidade que se tornam cegamente óbvias pela falta deles.
Phoshi
4
Como o C # veio mais tarde e foi inicialmente uma cópia flagrante do Java, teve a oportunidade de adicionar tudo o que acabou valendo a pena além disso, enquanto o Java foi prejudicado por objetivos muito rígidos de compatibilidade com versões anteriores.
Kilian Foth
2
@ Clockwork-Muse, mas o C # tem duas implementações de tempo de execução - CLR e Mono. Também há Xamarin. Não ouvi uma única solução para criar projetos cruzados iOS / Android / WinPhone usando Java.
Den
4
@KilianFoth: Na verdade, o C # era inicialmente um roubo do Delphi , reescrito para se parecer com Java. A Microsoft chegou a afastar o arquiteto do projeto Delphi da Borland para criá-lo.
Mason Wheeler

Respostas:

22

Várias razões:

  1. C # veio depois do Java; a versão 1 era uma cópia flagrante do Java 1.4, então praticamente tinha tudo o que o Java tinha naquele momento.
  2. Mas o C # se desenvolveu muito mais rápido que o Java, porque era uma plataforma nova e empolgante (e tinha um driver totalmente brilhante em Anders Hejlsberg, pai de Turbo Pascal). Isso lhes permitiu evitar todos os erros em Java que se tornaram óbvios, enquanto adicionavam tudo o que os praticantes de Java desejavam ter.
  3. Enquanto isso, o Java era dificultado por metas de compatibilidade com versões anteriores muito estritas e por um ritmo de desenvolvimento um pouco mais lento, em parte porque tentava desesperadamente obter uma reputação de ser a solução padrão, empreendedora, confiável e não surpreendente para os 95% de não gênios. programadores. Com isso, eles conseguiram, talvez um pouco demais.

O resultado é que o Java agora tem um pouco de uma lacuna de recursos. Ele tem grandes planos para o futuro, mas como sempre, com esse tipo de coisa, tudo leva um pouco mais do que o planejado.

Kilian Foth
fonte
7
Não tenho certeza se concordo com isso. Quero dizer, é tudo verdade, mas suspeito que o motivo tenha mais a ver com a política em torno do colapso do sol. O Java basicamente tinha mais de 5 anos onde não havia organização / liderança - portanto, não havia novos recursos.
Telastyn
7
C # 1 tinha tipos de valor. Algo que o Java nunca terá. Portanto, não apenas um "golpe flagrante".
Den
1
@ Telastyn - Eu acho que essa é a razão mais importante aqui. Especialmente quando você adiciona "e depois é adquirido pela Oracle" ao final do colapso do Sol.
Wyatt Barnett
7
Concorde com @Den. Eu acho que a maior razão para o desenvolvimento de C # mais rápido (e na direção certa) é a liderança de Anders Hejlsberg. Ele e sua equipe adicionaram os melhores recursos de outros idiomas e conseguiram integrá-los perfeitamente ao C #. O resultado é que o C # possui recursos de linguagem muito interessantes, sem se sentir confuso ou confuso.
David Kirkland
1
@WesleyWiser - atualizado para "pode ​​ter no futuro".
Den
4

Eu acrescentaria à resposta de Kilian que uma grande diferença entre Java e C # é que os designers de C # controlam não apenas a linguagem, mas também o IDE padrão.

Adicionar algo como métodos de extensão e classes parciais pode ser um pesadelo no controle de versão de desenvolvimento / controle se os IDEs não o suportarem adequadamente.

Como é esperado que você consiga compilar Java com sua plataforma preferida (Eclipse, Netbeans, vi + Ant), adicionar recursos que quebram o código (e usá-los para desenvolver extensões adicionais como LINQ) é muito mais complicado do que apenas dizer " como o IntelliSense lidará com esses casos, não precisamos nos preocupar ".

Além disso, às vezes vale a pena notar o valor dos recursos em vez de seu número. Por exemplo, as propriedades automáticas são boas e eu certamente desejo que o Java suporte isso, mas no final isso significa apenas que você precisa escrever mais algumas linhas de código em Java. Da mesma forma, acho que chamar "Eventos" de um recurso é um pouco inadequado, uma vez que eles são pouco mais do que delegados especialmente rotulados e apenas uma cópia refinada do padrão Observer já usado por Java (novamente, em Java, ele precisa de mais explicações). codificação)

Não me interpretem mal, acho que o C # introduziu várias inovações dignas de nota e desejo que algum dia os grandes chefes da Oracle acorde e lance um verdadeiro "Java 2" para incluir alguns deles, mas a diferença não é tão óbvia quanto a sua. pontos de interrogação.

SJuan76
fonte
2
As nove linhas necessárias para uma definição simples de propriedade (declaração + get / set + espaço em branco) somam rapidamente mais do que "algumas".
Kevin cline #
O @kevincline e eu também documentamos adequadamente os levantadores e os levantadores. Mas, no final, mesmo que eu não esteja usando minha geração automática de código IDE para o acessador, não estou gastando muito tempo com isso quando você considera o tempo gasto em lógica de negócios, testes, design de código (de fato Estou pensando principalmente sobre isso, mesmo ao digitar os acessadores). Assim, enquanto agradável, não é algo que faz uma grande diferença no final ...
SJuan76
3
Não é hora de escrevê-los. É hora de lê-los e ignorá-los várias vezes, enquanto você está no caminho para as partes interessantes.
Kevin cline #
@kevincline Eu concordo, é bastante legível e o código está limpo. É por isso que eu valorizo coisas como eventos, que são apenas um built-in padrão Observer, mas tornar as coisas muito thab mais limpa se você tivesse que escrever esses mesmo
Aviv Cohn
@AvivCohn O problema é que "embutido" é a parte principal. Você pode ter despacho dinâmico no assembly, funções de ordem superior em C, todos os recursos de idioma que você pode ter são possíveis no assembly - obviamente, já que em algum momento, ele ainda roda na sua CPU x86. Você raramente precisa implementar o padrão de comando no C #, porque você tem delegados. O mesmo acontece com o Observer e os eventos, e muitos outros. O Java teve métodos anônimos por algum tempo, mas você teve que criar um tipo anônimo inteiro . Todas essas coisas são pequenas, mas se somam.
Luaan