Passa da C # a Java, quali "gotchas" dovrei preoccuparmi?


9

Potrei dover passare a Java per un nuovo progetto. Ho pochissime conoscenze su Java, perché ho principalmente studiato e usato C # e temo che le differenze tra queste due lingue / piattaforme dovrebbero probabilmente causarmi molti problemi.

Quali sono le insidie ​​/ problemi che dovrei preoccuparmi?


Penso che questo blog copra molte cose che stai cercando .. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
Ci sono molte differenze tra C # e Java e ognuna è una potenziale "risposta" a questa domanda. Tuttavia, dubito che sarebbe molto utile a te o agli altri. Fare una domanda più specifica e reale darebbe risposte più utili. In alternativa, prova a chiedere riferimenti o guide per passare da C # a Java anziché le differenze (effettivamente infinite).

In altre parole, prova invece a porre una domanda "perché" o "come" su un problema specifico. Ad esempio, chiedere riferimenti, guide o libri è come chiedere "come posso passare da C # a Java", oppure fare domande su un codice specifico che non si capisce è una domanda "perché fa X invece di Y".

Prendi in considerazione l'
idea di

Risposte:


36

Ecco alcuni importanti gotcha Java provenienti da C #:

  • In Java, i switchcasi possono passare silenziosamente al successivo, quindi assicurati di inserire sempre breakogni volta che è appropriato. Non è inoltre possibile switchsu Stringin Java.
  • I generici non sono reificati e parametrizzabili solo con tipi di riferimento. Non c'è List<int>, solo a List<Integer>. Autoboxing nasconde la verbosità, ma è possibile ottenere NullPointerExceptionquando si deseleziona un null. Inoltre, ==e !=su due tipi primitivi inscatolati eseguono un confronto di riferimento.
    • ... perché ==e !=su due tipi di riferimento (ad es. String) sono sempre confronti di riferimento
    • Un intpuò essere autoboxato in un Integer; non c'è autoboxing da int[]a Integer[].
  • Java byte, short, int, longsono firmati solo. Controlla l'estensione del segno non intenzionale.
  • Nessun array multidimensionale, solo array di array in Java.
  • La maggior parte dei sub*metodi di query a distanza utilizza il limite inferiore incluso e il limite superiore esclusivo

Guarda anche

Domande correlate

Su alcuni argomenti sopra elencati:

Sui gotcha generali di Java:


8
Ora puoi attivare String in Java SE 7.
Malcolm

+1 per i generici non sono reificati e parametrizzabili solo con tipi di riferimento , questo mi ha aiutato molto oggi
cctan,

Dovresti anche aggiungere che java non ha strutture.

13

Un ovvio insuccesso è il confronto tra stringhe e stile C # string1 == string2(Java confronta solo riferimenti) anziché stile Java string1.equals(string2).

Un altro è che privateè il modificatore di accesso predefinito in C #, packagein Java.

Inoltre i ToString()metodi non sono localizzati automaticamente dalla cultura corrente in Java.


Questa è un'estensione del fatto che non ci sono sovraccarichi dell'operatore.
Graphain,

3
Sbagliato. Package-private è il modificatore di accesso predefinito di Java.
Oliver Weiler,

Metodo @Helper: Oh, scusa. Intendevo C # come privato di default, ma non Java. Ora è modificato.

12

Quello che mi ha procurato è stato che gli argomenti di sottostringa Java sono beginIndex, endIndex mentre gli argomenti di sottostringa C # sono startIndex, lunghezza. Questa è una differenza sufficiente per renderlo fastidioso e una buona probabilità di ottenere l'indice fuori dai limiti in entrambi i modi.


3
+1 Più confuso è il fatto che è beginIndex INCLUSIVE ed endIndex EXCLUSIVE ... e che ci sono alcune API trovate nel JDK che usano startIndex, approccio di lunghezza ...
Oliver Weiler,

10
  • Non ottieni LINQ
  • Non ottieni un'interfaccia utente dall'aspetto gradevole (nessun WPF)
  • Nessuna proprietà
  • Fai ballare gli egiziani
  • Ottieni API senza esempi e buona documentazione

Hm.


2
Non ho mai trovato l'API Java male (in effetti più facile da navigare) ma ci sono sicuramente meno esempi. Cos'è questo degli egiziani?
Graphain,

3
Sto votando questo ...... anche se è un colpo sarcastico basso.
Aprire il


8
Sono vere insidie? Comprendo le insidie ​​come possibili cause di bug. Queste sono solo cose con cui devi convivere poiché non puoi fare diversamente.

2
@cloudanger: sono d'accordo con te. Le insidie ​​dovrebbero essere qualcosa che "funziona" in modo errato, non qualcosa che non funziona nemmeno.
Vimvq1987,

10
  • Gli enumerazioni Java sono molto più potenti / complicati, in realtà sono classi reali invece di numeri interi nominati.
  • le classi interne in Java sono più potenti (e si comportano diversamente)
  • nessun delegato, solo oggetti funzionali
  • il concatenatore di concatenamento ha una sintassi completamente diversa in entrambe le lingue, tendo a fallire ogni volta che devo farlo in c #
  • Java ha esteso per la sottoclasse e gli strumenti per le interfacce, il che è abbastanza carino. C # invece fa affidamento su una convenzione di denominazione che dice che le interfacce iniziano con un I maiuscolo nel loro nome. Non mi piace quella convenzione, dato che non posso mai essere sicuro che qualcun altro fallisca.
  • java autoboxing può morderti in a **
  • la cancellazione di tipo java rende le cose più complicate

2
Stai scherzando, vero? -1, tuttavia. Non puoi essere serio.

3
dovresti almeno chiarire quale punto non ti piace, altrimenti devo presumere che stai solo trollando.
atamanroman,

2
ora non stai solo scherzando ma sei solo ignorante: Linux È importante nell'area back-end, javadoc è molto più pulito di questi stupidi file di aiuto ms che non funzioneranno se li visualizzi dalle condivisioni di rete. sandcastle non è quasi documentato e completamente inutilizzabile senza una corretta interfaccia grafica. la maggior parte dei ppl concorderà sul fatto che ci siano davvero delle belle collezioni nel framework java e joshua bloch ha fatto un buon lavoro lì. E i libri "a uovo" sono solo libri che non capisci. Eclipse è un IDE fantastico che VS non può sopportare senza plugin esterni. Btw: Mi piace C # e mi manca Linq in Java. Esci dal tuo mondo di ms-office.
atamanroman,

1
Solo uno di questi oggetti è un gotcha
finnw,

1
-1 anche da me, non sai cosa sia un buon ide (e quindi non sai molto di tutto ciò che riguarda la programmazione). Modifica: Pffft Java più maturo, Java non ha nemmeno veri generici ..

6

La più grande trappola è supporre che il linguaggio e le librerie Java si comportino allo stesso modo di cose simili in C #. Fai i tutorial, leggi i javadocs, non dare per scontato ...

Un'altra meta-trappola è presumere che il fatto che tu possa fare qualcosa in Java nel modo più semplice / piacevole che puoi / potresti in C #. Non è vero. Java è una lingua molto più antica e sono stati commessi errori ...

E l'ultima meta-trappola è pensare che lamentarsi di cose mancanti o diverse in Java su SO ti darà risposte universalmente comprensive / di supporto!


3

Fai attenzione alle differenze nei modificatori di accesso predefiniti. Si noti inoltre che tutti i metodi non statici in Java sono virtuali (a meno che non vengano contrassegnati come finali).

Anche se è in qualche modo obsoleto, ho trovato che questo è un ottimo riferimento.

Confronto tra C # e Java, di Dare Obasanjo


3
Also note that all non-static methods in Java are virtual.Come vorrei che anche C # fosse così
Graphain il

3
Sono contento che non lo sia, poiché distrugge la ragione di OOP. Poiché ogni metodo è virtuale per impostazione predefinita, fondamentalmente si consente di sostituire l'intera classe, cosa che di solito non si desidera. Inoltre, la modifica di un metodo da non finale a finale può interrompere il codice derivato, mentre non è così.
Femaref


0

Penso che la tua domanda sia soggettiva. Tutto non può essere spiegato qui. Ti consiglio di leggere Java Puzzlers , di Joshua Bloch and Neal Gafter. Puoi saperne di più ed essere al sicuro dalle insidie.


non tutte le insidie, ma è probabile che
insorgano

1
@ Vimvq1987 - non c'è motivo di supporre che non ti imbatterai nelle insidie ​​"Java Puzzlers" dopo il passaggio a Java.
Stephen C,

-1

Nel linguaggio Java gli equivalenti oggettivi di tipi primitivi come int, char, non sono "tipi di valore" (es. Integer è un tipo di riferimento). In C # System.Int32 è una struttura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.