Перейдіть з C # на Java, який "gotchas" мені повинен хвилювати?


9

Можливо, мені доведеться перейти на Java для нового проекту. У мене дуже мало знань про Java, тому що я в основному вивчав і використовував C #, і боюся, що відмінності між цими двома мовами / платформами, ймовірно, можуть викликати у мене багато проблем.

Які підводні камені / gotchas мені слід подбати?


Я думаю, що цей блог охоплює багато речей, які ви шукаєте .. ericsink.com/entries/java_eclipse_2.html
Hari Menon

3
Між C # і Java існує багато відмінностей, і кожна з них є потенційною "відповіддю" на це питання. Однак я сумніваюся, що було б дуже корисно для вас чи інших. Якщо задати більш конкретний, справжнє запитання дасть більше корисних відповідей. Крім того, спробуйте попросити посилання чи посібники для переходу з C # на Java, а не (фактично нескінченні) відмінності.

Іншими словами, спробуйте задати натомість питання "чому" чи "як" щодо певної проблеми. Наприклад, запитувати довідники, путівники чи книги - це як запитати "як я можу перейти з C # на Java", або запитання про конкретний код, який ви не розумієте, - це питання "чому це робиться X замість Y".

Подумайте про те, щоб зробити цю спільноту вікі
finnw

Відповіді:


36

Ось декілька важливих моментів Java, що надходять із C #:

  • На Java switchвипадки можуть мовчки переходити до наступного, тому переконайтеся, що ви завжди ставите, breakколи це доречно. Ви також не можете switchна Stringв Java.
  • Генеріки не ретифіковані та параметризуються лише для посилальних типів. Немає List<int>, тільки а List<Integer>. Автобоксинг приховує багатослівність, але ви можете отримати її NullPointerExceptionпри розпакуванні a null. Крім того, ==і !=на двох коробках примітивні типи виконують порівняльне порівняння.
    • ... тому що ==і !=за двома типами посилань (наприклад String) завжди є порівняльним порівнянням
    • intМоже бути autoboxed до Integer; немає автоматичної коробки від int[]до Integer[].
  • В Java byte, short, int, longпідписуються тільки. Слідкуйте за ненавмисним розширенням знаку.
  • Немає багатовимірних масивів, лише масив масивів на Java.
  • Більшість sub*діапазонних методів запитів використовують нижню та виключну верхню межу

Дивись також

Пов'язані питання

З деяких перелічених вище тем:

На загальних Java-кодах:


8
Тепер ви можете увімкнути String в Java SE 7.
Малькольм

+1 для Generics не повторне і не може бути параметризовано лише для посилальних типів , це мені сьогодні дуже допомогло
cctan

Також слід додати, що java не має структур.

13

Очевидною проблемою є порівняння рядків зі стилем C # string1 == string2(Java порівнює лише посилання) замість стилю Java string1.equals(string2).

Ще один - privateмодифікатор доступу за замовчуванням у C #, packageна Java.

Також ToString()методи не локалізуються автоматично поточною культурою на Java.


Це розширення факту, що немає перевантажень оператора.
Графайн

3
Неправильно. Package-private - це модифікатор доступу Java за замовчуванням.
Олівер Вайлер

@Helper Метод: О, вибачте. Я мав на увазі, що C # мав приватний за замовчуванням, але не Java. Зараз це відредаговано.

12

Один, що отримав мене, - це аргументи підрядки Java - StartIndex, endIndex, тоді як C # Subtring аргументи - startIndex, length. Цього достатньо різниці, щоб зробити це дратівливим і хороша ймовірність отримання індексу поза межами будь-якого способу переключення.


3
+1 Більш заплутаним є той факт, що це beginIndex INCLUSIVE та endIndex EXCLUSIVE ... і що в JDK знайдені деякі API, які використовують startIndex, підхід по довжині ...
Олівер Вайлер,

10
  • Ви не отримуєте LINQ
  • Ви не отримаєте гарного інтерфейсу (без WPF)
  • Немає властивостей
  • Ви отримуєте танці єгиптян
  • Ви отримуєте API без прикладів та гарної документації

Гм.


2
Ніколи не знаходив Java Java поганий (насправді простіше орієнтуватися), але прикладів напевно менше. Що це за єгиптяни?
Графайн

3
Я підтримую це ...... навіть якщо це саркастичний низький удар.
mpen


8
Це справжні підводні камені? Я розумію підводні камені як можливі причини помилок. Це лише речі, з якими вам доведеться жити, так як ви не можете зробити інший спосіб.

2
@cloudanger: згоден з тобою. Підводні камені повинні бути щось, що "працює" неправильно, а не те, що навіть не працює.
Vimvq1987

10
  • Перерахунки Java набагато потужніші / складніші, вони насправді справжні класи замість названих цілих чисел.
  • внутрішні класи в java є більш потужними (і вони поводяться по-різному)
  • немає делегатів, лише функціональні об'єкти
  • конструктор, що зав'язує річ, має абсолютно різний синтаксис в обох мовах, і я, як правило, виходить з ладу щоразу, коли мені доводиться це робити в c #
  • У Java є розширення для підкласифікації та реалізації інтерфейсів, що дуже приємно. Натомість C # ретранслює конвенцію про іменування, яка говорить про те, що інтерфейси починаються з великого регістру I на їх ім'я. Мені не подобається ця конвенція, оскільки я ніколи не можу бути впевнений, чи не вдасться хтось інший.
  • java autoboxing може вкусити вас у **
  • стирання типу java справді ускладнює справи

2
Ви жартуєте, правда? -1, однак. Ви не можете бути серйозними.

3
ви повинні принаймні уточнити, який момент вам не подобається, інакше я повинен припустити, що ви просто тролінгуєте.
отаманроман

2
тепер ваш не лише жарт, але ви просто невідомий: Linux важливий у зоні створення, javadoc набагато чистіший, ніж ці дурні файли довідки, які не працюють, якщо ви переглядаєте їх із мережевих акцій. Піщаний пісок майже не задокументований і абсолютно непридатний для використання без належного Gui. Більшість ppl погодиться з тим, що там дійсно приємні колекції в рамках Java і блог Джошуа зробив там хорошу роботу. І "яєчниця" книги - це просто книги, які ти не розумієш. Eclipse - це дивовижний IDE, який VS не може стояти без зовнішніх плагінів. Btw: Мені подобається C # і пропускаю linq в Java. Вийдіть зі свого світу-офісу.
отаманроман

1
Лише один із цих предметів
готча

1
-1 від мене теж ти не знаєш, що таке хороша ідея (і, отже, не знаєш багато нічого, що стосується програмування). Редагувати: Pffft Java більш зрілий, у Java навіть немає справжніх дженериків ..

6

Найбільша мета-помилка - припустити, що мова Java та бібліотеки поводяться так само, як схожі на C # речі. Робіть підручники, читайте javadocs, не припускайте ...

Ще одна мета-проблема - припустити, що те, що ти можеш робити щось на Яві так само легко / красиво, як ти можеш / міг би в C #. Це неправда. Java - набагато старша мова, і помилки були допущені ...

І останній мета-камін - це думати, що скарги на те, що речі відсутні / різні в Java на SO, отримають вам загальноприхильні / підтримуючі відповіді!


3

Остерігайтеся відмінностей у модифікаторах доступу за замовчуванням. Також зауважте, що всі нестатичні методи на Java є віртуальними (якщо ви не позначите їх як кінцеві).

Хоча це дещо застаріло, я вважаю це чудовим посиланням.

Порівняння C # та Java, від Dare Obasanjo


3
Also note that all non-static methods in Java are virtual.Як би я хотів, щоб і C # був таким
Graphain

3
Я радий, що це не так, оскільки це руйнує причину ООП. Оскільки кожен метод є віртуальним за замовчуванням, ви в основному дозволяєте замінити весь ваш клас, чого ви зазвичай не хочете. Крім того, зміна методу з нефінального на кінцевий може порушити похідний код, тоді як інший спосіб цього не зробить.
Фемареф

2

залежить від того, над якою програмою ви працюєте. У Вікіпедії є ця стаття, і вона досить обширна. (також перегляньте розділ "зовнішні посилання" наприкінці) http://en.wikipedia.org/wiki/Comppare_of_Java_and_C_Sharp .

Крім того, я читав цю статтю, коли перейшов з C # на Java http://www.25hoursaday.com/CsharpVsJava.html, і це було дуже корисно.


0

Я думаю, що ваше питання є суб'єктивним. Тут все не можна пояснити. Я пропоную вам прочитати Java Puzzlers , авторJoshua Bloch and Neal Gafter . Ви можете дізнатися більше і бути в безпеці від підводних каменів.


не всі підводні камені, але підводні камені, які програміст C #, швидше за все, роблять на Яві :)
Vimvq1987

1
@ Vimvq1987 - немає причин вважати, що після переходу на Java ви не потрапите в підводні камені Java Puzzlers.
Stephen C

-1

У мові Java об'єктивні еквіваленти примітивних типів, таких як int, char, не є "типами значень" (наприклад, Integer - це еталонний тип). У C # System.Int32 - це структура.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.