Mudar de C # para Java, quais “dicas” eu deveria me importar?


9

Talvez eu precise mudar para Java para novo projeto. Eu tenho muito pouco conhecimento sobre Java, porque estudei e usei C # principalmente, e tenho medo das diferenças entre essas duas linguagens / plataformas que provavelmente me causarão muitos problemas.

Quais são as armadilhas / dicas que eu deveria me preocupar?


Eu acho que este blog cobre um monte de coisas que você está procurando .. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
Existem muitas diferenças entre C # e Java e cada uma delas é uma "resposta" em potencial para essa pergunta. No entanto, duvido que isso seja muito útil para você ou outras pessoas. Fazer uma pergunta mais específica e real traria respostas mais úteis. Como alternativa, tente solicitar referências ou guias para alternar de C # para Java, em vez das diferenças (efetivamente intermináveis).

Em outras palavras, tente fazer uma pergunta "por que" ou "como" sobre um problema específico. Por exemplo, pedir referências, guias ou livros é como perguntar "como posso mudar de C # para Java" ou perguntar sobre código específico que você não entende é uma pergunta "por que isso faz X em vez de Y".

Considere tornar este wiki-comunidade
Finnw

Respostas:


36

Aqui estão algumas dicas importantes sobre Java quando provenientes do C #:

  • Em Java, os switchcasos podem passar silenciosamente para o próximo, portanto, sempre coloque sempre breakque apropriado. Você também não pode switchem Stringem Java.
  • Os genéricos não são reificados e parametrizáveis ​​apenas com tipos de referência. Não existe List<int>, apenas a List<Integer>. A caixa automática oculta a verbosidade, mas você pode obter NullPointerExceptionao desmarcar a null. Além disso, ==e !=em dois tipos primitivos in a box realizam comparação de referência.
    • ... porque ==e !=em dois tipos de referência (por exemplo String) são sempre comparação de referência
    • Um intpode ser autoboxado para um Integer; não há autoboxing de int[]para Integer[].
  • Java de byte, short, int, longsó são assinados. Preste atenção na extensão de sinal não intencional.
  • Nenhuma matriz multidimensional, apenas matriz de matrizes em Java.
  • A maioria dos sub*métodos de consulta à distância usa o limite inferior inclusivo e o limite superior exclusivo

Veja também

Perguntas relacionadas

Em alguns tópicos listados acima:

Em dicas gerais sobre Java:


8
Agora você pode ativar a String no Java SE 7.
Malcolm

+1 para Genéricos são não-reificada e parametrizável com apenas tipos de referência , isso me ajudou muito hoje
cctan

Você também deve adicionar o java não possui estruturas.

13

Uma armadilha óbvia é comparar seqüências de caracteres com o estilo C # string1 == string2(Java compara apenas referências) em vez do estilo Java string1.equals(string2).

Outro privateé o modificador de acesso padrão em C #, packageem Java.

Também ToString()métodos não são localizados automaticamente pela cultura atual em Java.


Esta é uma extensão do fato de não haver sobrecargas do operador.
Graffin

3
Errado. Package-private é o modificador de acesso padrão do Java.
Oliver Weiler

Método @ Helper: Oh, desculpe. Eu quis dizer que o C # tinha privado como padrão, mas não o Java. Agora está editado.

12

O que me deu as args de substring Java é beginIndex, endIndex, enquanto C # Subtring args são startIndex , length. Isso é suficiente para torná-lo irritante e uma boa probabilidade de obter o índice fora dos limites de qualquer maneira que você alternar.


3
+1 mais confuso é o fato, que é beginIndex inclusiva e endIndex EXCLUSIVO ... e que há alguns API da encontrada no JDK que usar a abordagem comprimento startIndex ...
Oliver Weiler

10
  • Você não recebe LINQ
  • Você não obtém uma interface bonita (sem WPF)
  • Sem propriedades
  • Você começa a dançar egípcios
  • Você obtém APIs sem exemplos e boa documentação

Hum.


2
Nunca considerou a API Java ruim (de fato, mais fácil de navegar), mas existem definitivamente menos exemplos. O que é isso sobre os egípcios?
Graffin

3
Estou votando nisso ...... mesmo que seja um golpe baixo sarcástico.
MPEN


8
Essas são verdadeiras armadilhas? Entendo as armadilhas como possíveis causas de bugs. São coisas com as quais você tem que conviver, pois não pode fazer de outra maneira.

2
@cloudanger: concordo com você. As armadilhas devem ser algo que "funcione" incorretamente, não algo que nem funcione.
Vimvq1987

10
  • As enumerações de Java são muito mais poderosas / complicadas; na verdade, são classes reais em vez de números inteiros nomeados.
  • classes internas em java são mais poderosas (e se comportam de maneira diferente)
  • sem delegados, apenas objetos funcionais
  • o construtor encadeando uma coisa tem uma sintaxe completamente diferente nos dois idiomas, tendo a falhar toda vez que preciso fazer isso em c #
  • O Java estende-se à subclassificação e implementa interfaces, o que é bastante interessante. O C # utiliza uma convenção de nomenclatura que diz que as interfaces começam com um I maiúsculo em seu nome. Não gosto dessa convenção, pois nunca posso ter certeza se alguém falhará.
  • o autoboxing de java pode morder você no a **
  • apagamento tipo java realmente torna as coisas mais complicadas

2
Você está brincando, certo? -1, no entanto. Você não pode estar falando sério.

3
você deve pelo menos esclarecer qual ponto não gosta, caso contrário, devo assumir que você está apenas trollando.
Atman2man

2
agora você não está apenas brincando, mas é apenas ignorante: o linux é importante na área de back-end, o javadoc é muito mais limpo do que esses arquivos estúpidos de ajuda da ms que não funcionarão se você os visualizar a partir de compartilhamentos de rede. o castelo de areia quase não está documentado e é completamente inutilizável sem uma interface gráfica adequada. a maioria das pessoas concorda que há coleções realmente boas no framework java e joshua bloch fez um bom trabalho lá. E livros "inteligentes" são apenas livros que você não entende. O Eclipse é um IDE incrível que o VS não suporta sem plug-ins externos. Btw: Eu gosto de c # e sinto falta de linq em java. Saia do seu mundo ms-office.
Atman2man

11
Apenas um desses itens é um problema
finnw

11
-1 de mim também, você não sabe o que é um bom ide (e, portanto, não sabe muito de nada relacionado à programação). Edit: Pffft Java mais maduro, Java não tem sequer genéricos reais ..

6

A maior meta-armadilha é assumir que a linguagem e as bibliotecas Java se comportam da mesma maneira que as coisas de aparência semelhante em C #. Faça os tutoriais, leia os javadocs, não assuma ...

Outra meta-armadilha é supor que o fato de que você pode fazer algo em Java da mesma maneira tão fácil / agradável quanto possível / possível em C #. Não é verdade. Java é uma linguagem muito mais antiga e erros foram cometidos ...

E a última meta-armadilha é pensar que reclamar sobre coisas que estão faltando / diferentes no Java on SO fornecerá respostas universalmente solidárias / solidárias!


3

Cuidado com as diferenças nos modificadores de acesso padrão. Observe também que todos os métodos não estáticos em Java são virtuais (a menos que você os marque como finais).

Embora esteja um pouco desatualizado, achei uma ótima referência.

Comparação de C # e Java, por Dare Obasanjo


3
Also note that all non-static methods in Java are virtual.Como eu queria C # foi assim também
Graphain

3
Fico feliz que não seja, pois destrói o motivo da OOP. Com todos os métodos sendo virtuais por padrão, você basicamente permite que toda a classe seja substituída, o que geralmente você não deseja. Além disso, alterar um método de não final para final pode interromper o código derivado, enquanto o contrário não ocorre.
Femaref 03/03


0

Eu acho que sua pergunta é subjetiva. Tudo não pode ser explicado aqui. Eu sugiro que você leia Java Puzzlers , By Joshua Bloch and Neal Gafter. Você pode aprender mais e se proteger das armadilhas.


nem todas as armadilhas, mas armadilhas que são programador C # são susceptíveis de fazer, em Java :)
Vimvq1987

11
@ Vimvq1987 - não há razão para supor que você não se deparará com as armadilhas do "Java Puzzlers" depois de mudar para o Java.
Stephen C

-1

Na linguagem Java, os equivalentes objetivos de tipos primitivos, como int, char, não são "tipos de valor" (por exemplo, Inteiro é um tipo de referência). Em C #, o System.Int32 é uma estrutura.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.