Przełącz się z C # na Javę, które „gotchas” powinienem obchodzić?

9

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ć?

Vimvq1987
źródło
Myślę, że ten blog obejmuje wiele rzeczy, których szukasz ... ericsink.com/entries/java_eclipse_2.html
Hari Menon
3
Istnieje wiele różnic między C # a Javą i każda z nich jest potencjalną „odpowiedzią” na to pytanie. Wątpię jednak, czy byłoby to bardzo przydatne dla ciebie lub innych. Zadanie bardziej konkretnego, prawdziwego pytania dałoby bardziej przydatne odpowiedzi. Alternatywnie, spróbuj poprosić o referencje lub przewodniki dotyczące przejścia z C # na Javę zamiast (efektywnie nieskończonych) różnic.
Innymi słowy, zamiast tego spróbuj zadać pytanie „dlaczego” lub „jak” dotyczące konkretnego problemu. Na przykład pytanie o referencje, przewodniki lub książki przypomina pytanie „jak mogę przejść z C # na Javę” lub pytanie o konkretny kod, którego nie rozumiesz, to pytanie „dlaczego robi to X zamiast Y”.
Rozważ utworzenie społeczności wiki
finnw

Odpowiedzi:

36

Oto kilka ważnych gotch Java, pochodzących z C #:

  • W Javie switchsprawy mogą dyskretnie przechodzić do następnych, więc upewnij się, że zawsze umieszczasz je w breakdowolnym momencie. Nie można też switchna Stringw Javie.
  • Generyczne są nierefikowane i parametryzowalne tylko z typami referencyjnymi. Nie ma List<int>, tylko List<Integer>. Autoboxing ukrywa gadatliwość, ale możesz ją uzyskać NullPointerExceptionpo rozpakowaniu a null. Również ==i !=na dwóch ramkach prymitywne typy wykonać porównania odniesienia.
    • ... ponieważ ==i !=na dwóch typach referencyjnych (np. String) są zawsze porównania referencyjne
    • An intmoże być autoboxed do Integer; nie ma autoboxingu od int[]do Integer[].
  • Java byte, short, int, longsą podpisane tylko. Uważaj na niezamierzone rozszerzenie znaku.
  • Brak wielowymiarowych tablic, tylko tablica w Javie.
  • Większość sub*metod zapytań dystansowych używa włącznie dolnej granicy i wyłącznej górnej granicy

Zobacz też

Powiązane pytania

Na niektóre wyżej wymienione tematy:

W przypadku ogólnych gotch Java:

środki smarujące wielotlenowe
źródło
8
Teraz możesz włączyć String w Javie SE 7.
Malcolm,
+1 dla Generics są niezrefikowane i parametryzowalne tylko z typami referencyjnymi , bardzo mi to dzisiaj
pomogło
Powinieneś także dodać, że Java nie ma struktur.
13

Jednym oczywistym błędem jest porównywanie ciągów ze stylem C # string1 == string2(Java porównuje tylko odwołania) zamiast ze stylem Java string1.equals(string2).

Innym jest privatedomyślny modyfikator dostępu w języku C # packagew Javie.

Również ToString()metody nie są automatycznie lokalizowane przez bieżącą kulturę w Javie.

Cloudanger
źródło
Jest to przedłużenie faktu, że nie występują przeciążenia operatora.
Graphain
3
Źle. Package-private jest domyślnym modyfikatorem dostępu Java.
Oliver Weiler,
@Helper Method: Och, przepraszam. Miałem na myśli, że C # ma domyślnie prywatny, ale nie Java. Jest teraz edytowany.
12

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.

krock
źródło
3
+1 bardziej mylące jest fakt, że to beginIndex INCLUSIVE i endIndex EXCLUSIVE ... i że istnieją pewne API znaleźć w JDK, które wykorzystują startIndex, podejście długości ...
Oliver Weiler
10
  • Nie masz LINQ
  • Nie masz dobrze wyglądającego interfejsu użytkownika (bez WPF)
  • Brak właściwości
  • Tańczycie Egipcjan
  • Dostajesz interfejsy API bez przykładów i dobrej dokumentacji

Hm


źródło
2
Nigdy nie znalazłem złego Java API (w rzeczywistości łatwiejszego w nawigacji), ale jest zdecydowanie mniej przykładów. Co to jest o Egipcjanach?
Graphain
3
Głosuję za tym ...... nawet jeśli jest to sarkastyczny niski cios.
mpen
8
Czy to są prawdziwe pułapki? Rozumiem pułapki jako możliwe przyczyny błędów. To tylko rzeczy, z którymi musisz żyć, ponieważ nie możesz zrobić w żaden inny sposób.
2
@cloudanger: zgadzam się z tobą. Pułapki powinny być czymś, co „działa” nieprawidłowo, a nie czymś, co nawet nie działa.
Vimvq1987
10
  • Wyliczenia Java są znacznie bardziej wydajne / skomplikowane, w rzeczywistości są prawdziwymi klasami zamiast nazwanych liczb całkowitych.
  • klasy wewnętrzne w java są silniejsze (i zachowują się inaczej)
  • bez delegatów, tylko obiekty funkcjonalne
  • łańcuch konstruktora ma zupełnie inną składnię w obu językach, zwykle zawodzę za każdym razem, gdy muszę to zrobić w c #
  • Java rozszerza się na podklasę i implementuje interfejsy, co jest całkiem miłe. Zamiast tego C # przekazuje konwencję nazewnictwa, która mówi, że interfejsy zaczynają się od dużej litery I w ich nazwie. Nie podoba mi się ta konwencja, ponieważ nigdy nie mogę być pewien, czy ktoś inny zawiedzie.
  • java autoboxing może ugryźć cię w **
  • usuwanie typu Java naprawdę komplikuje sprawę
atamanroman
źródło
2
Żartujesz, prawda? -1 jednak. Nie możesz mówić poważnie.
3
powinieneś przynajmniej wyjaśnić, który punkt ci się nie podoba, w przeciwnym razie muszę założyć, że trollujesz.
atamanroman
2
teraz nie tylko żartujesz, ale jesteś po prostu ignorantem: Linux jest ważny w obszarze zaplecza, javadoc jest znacznie czystszy niż te głupie pliki pomocy MS, które nie będą działać, jeśli zobaczysz je z udziałów sieciowych. zamek z piasku jest prawie nieudokumentowany i całkowicie bezużyteczny bez odpowiedniego GUI. większość ppl zgodzi się, że w frameworku Java są naprawdę fajne kolekcje, a Joshua Bloch wykonał tam niezłą robotę. A książki „jajogłowy” to tylko książki, których nie rozumiesz. Eclipse to niesamowite IDE, które VS nie może stać bez zewnętrznych wtyczek. Btw: Lubię C # i tęsknię za linq w java. Wynoś się ze swojego MS-Office-World.
atamanroman
1
Tylko jeden z tych przedmiotów to gotcha
fin
1
-1 ode mnie też, nie wiesz, co to jest dobry ide (a zatem nie wiesz zbyt wiele o czymkolwiek związanym z programowaniem). Edycja: Pffft Java bardziej dojrzała, Java nawet nie ma prawdziwych generyków.
6

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!

Stephen C.
źródło
3

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

użytkownik5631
źródło
3
Also note that all non-static methods in Java are virtual.Chciałbym, żeby C # też tak
wyglądał
3
Cieszę się, że tak nie jest, ponieważ niszczy powód OOP. Ponieważ każda metoda jest domyślnie wirtualna, zasadniczo umożliwiasz zastąpienie całej klasy, czego zwykle nie chcesz. Także zmiana metody z nie-finałowej na finalną może przerwać wyprowadzanie kodu, podczas gdy w drugą stronę nie.
Femaref,
0

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
nie wszystkie pułapki, ale najprawdopodobniej pułapki, które są programistami C #, w Javie :)
Vimvq1987 15.07
1
@ Vimvq1987 - nie ma powodu przypuszczać, że po przejściu na Javę nie wpadniesz w pułapki „Java Puzzlers”.
Stephen C
-1

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