Być może będę musiał przejść na Javę dla nowego projektu. Mam bardzo małą wiedzę o Javie, ponieważ głównie studiowałem i używałem C #, i obawiam się, że różnice między tymi dwoma językami / platformami powinny spowodować mi wiele problemów.
Na jakich pułapkach / problemach powinienem się przejmować?
Odpowiedzi:
Oto kilka ważnych gotch Java, pochodzących z C #:
switch
sprawy mogą dyskretnie przechodzić do następnych, więc upewnij się, że zawsze umieszczasz je wbreak
dowolnym momencie. Nie można teżswitch
naString
w Javie.List<int>
, tylkoList<Integer>
. Autoboxing ukrywa gadatliwość, ale możesz ją uzyskaćNullPointerException
po rozpakowaniu anull
. Również==
i!=
na dwóch ramkach prymitywne typy wykonać porównania odniesienia.==
i!=
na dwóch typach referencyjnych (np.String
) są zawsze porównania referencyjneint
może być autoboxed doInteger
; nie ma autoboxingu odint[]
doInteger[]
.byte
,short
,int
,long
są podpisane tylko. Uważaj na niezamierzone rozszerzenie znaku.sub*
metod zapytań dystansowych używa włącznie dolnej granicy i wyłącznej górnej granicyString.substring(int beginIndex, int endIndex)
CharSequence.subSequence(int start, int end)
List.subList(int fromIndex, int toIndex)
SortedSet<E>.subSet(E fromElement, E toElement)
SortedMap<K,V>.subMap(K fromKey, K toKey)
Zobacz też
Powiązane pytania
Na niektóre wyżej wymienione tematy:
new Integer(i) == i
w Javie? (TAK!)==
/!=
) występuje automatyczne rozpakowywanie? (NIE!)int num = Integer.getInteger("123")
rzucaNullPointerException
? (!!!)W przypadku ogólnych gotch Java:
źródło
Jednym oczywistym błędem jest porównywanie ciągów ze stylem C #
string1 == string2
(Java porównuje tylko odwołania) zamiast ze stylem Javastring1.equals(string2)
.Innym jest
private
domyślny modyfikator dostępu w języku C #package
w Javie.Również
ToString()
metody nie są automatycznie lokalizowane przez bieżącą kulturę w Javie.źródło
Ten, który mnie dostał, to argumenty podłańcuchowe Java: beginIndex, endIndex, a argumenty C # Subtring to startIndex, długość. To wystarczająca różnica, aby było to denerwujące i duże prawdopodobieństwo, że indeks wypadnie poza granice przy każdej zmianie.
źródło
Hm
źródło
źródło
Największym problemem jest założenie, że język Java i biblioteki zachowują się tak samo jak podobne rzeczy w języku C #. Wykonuj samouczki, czytaj javadocs, nie zakładaj ...
Inną pułapką jest założenie, że fakt, że możesz zrobić coś w Javie równie łatwo / ładnie, jak możesz / mógłbyś w C #. To nie prawda. Java jest znacznie starszym językiem i popełniono błędy ...
A ostatnią meta-pułapką jest myślenie, że narzekanie na brakujące / inne elementy w Javie na SO daje uniwersalne odpowiedzi / wsparcie!
źródło
Uważaj na różnice w domyślnych modyfikatorach dostępu. Pamiętaj również, że wszystkie metody niestatyczne w Javie są wirtualne (chyba że oznaczysz je jako ostateczne).
Chociaż jest to trochę nieaktualne, uważam, że jest to świetne odniesienie.
Porównanie C # i Java autorstwa Dare Obasanjo
źródło
Also note that all non-static methods in Java are virtual.
Chciałbym, żeby C # też takzależy od rodzaju programu, nad którym pracujesz. Wikipedia ma ten artykuł i jest dość obszerny. (sprawdź także sekcję „linki zewnętrzne” na końcu) http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp .
Przeczytałem również ten artykuł, kiedy przełączyłem się z C # na Javę http://www.25hoursaday.com/CsharpVsJava.html i było to bardzo przydatne.
źródło
Myślę, że twoje pytanie jest subiektywne. Nie można tutaj wszystkiego wyjaśnić. Sugeruję przeczytanie Java Puzzlers , By
Joshua Bloch and Neal Gafter
. Możesz dowiedzieć się więcej i być bezpiecznym przed pułapkami.źródło
W języku Java obiektywne odpowiedniki typów pierwotnych, takich jak int, char, nie są „typami wartości” (np. Liczba całkowita jest typem odniesienia). W języku C # System.Int32 jest strukturą.
źródło