Переключиться с C # на Java, какие «ошибки» мне следует позаботиться?

9

Возможно, мне придется перейти на Java для нового проекта. Я очень мало знаю о Java, потому что я в основном изучал и использовал C #, и я боюсь, что различия между этими двумя языками / платформами могут вызвать у меня много проблем.

О каких подводных камнях / ошибках я должен заботиться?

Vimvq1987
источник
Я думаю, что этот блог охватывает много вещей, которые вы ищете .. ericsink.com/entries/java_eclipse_2.html
Хари Менон
3
Есть много различий между C # и Java , и каждый из них является потенциальным «ответ» на этот вопрос. Однако я сомневаюсь, что это было бы очень полезно для вас или других. Задание более конкретного, реального вопроса даст более полезные ответы. В качестве альтернативы, попробуйте запросить ссылки или руководства для перехода с C # на Java, а не (по сути, бесконечные) различия.
Другими словами, попробуйте задать вопрос «почему» или «как» о конкретной проблеме. Например, запрос ссылок, руководств или книг - это все равно, что спросить «как я могу переключиться с C # на Java», или вопрос о конкретном коде, который вы не понимаете, - это вопрос «почему это делает X вместо Y».
Подумайте о создании этой вики-сообщества
finnw

Ответы:

36

Вот несколько важных моментов Java при переходе с C #:

  • В Java switchкейсы могут незаметно переходить к следующему, поэтому убедитесь, что вы всегда ставите их, breakкогда это необходимо. Вы также не можете switchна Stringв Java.
  • Обобщения являются нереализованными и параметризуемыми только с ссылочными типами. Нет List<int>, только кот List<Integer>. Автобокс скрывает многословие, но вы можете получить NullPointerExceptionпри распаковке null. Также ==и !=на двух штучных примитивных типах выполняют эталонное сравнение.
    • ... потому что ==и !=на двух ссылочных типах (например String) всегда есть ссылочные сравнения
    • An intможет быть автоматически упакован в Integer; нет автобокса от int[]до Integer[].
  • В Java byte, short, int, longподписываются только. Следите за непреднамеренным расширением знака.
  • Нет многомерных массивов, только массив массивов в Java.
  • Наиболее sub*ранжированные методы запроса используют включающую нижнюю границу и исключительную верхнюю границу

Смотрите также

Смежные вопросы

По некоторым темам, перечисленным выше:

На общих Java попал:

polygenelubricants
источник
8
Теперь вы можете включить String в Java SE 7.
Малкольм
+1 для Generics не реализованы и параметризуются только с ссылочными типами , это мне очень помогло сегодня
cctan
Вы должны также добавить, что у java нет структур.
13

Одна очевидная ловушка - сравнение строк в стиле C # string1 == string2(Java сравнивает только ссылки) вместо стиля Java string1.equals(string2).

Другой - это privateмодификатор доступа по умолчанию в C #, packageв Java.

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

Cloudanger
источник
Это расширение того факта, что нет никаких перегрузок операторов.
Графен
3
Неправильно. Package-private является модификатором доступа Java по умолчанию.
Оливер Вейлер
Метод @Helper: Ой, прости. Я имел в виду, что C # по умолчанию имеет private, но не Java. Это сейчас отредактировано.
12

Я получил аргументы подстроки Java : beginIndex, endIndex, а аргументы подстроки C # - startIndex, length. Этого достаточно для того, чтобы сделать это раздражающим, и хорошая вероятность того, что индекс выйдет за границы в любом случае, когда вы переключаетесь.

Крок
источник
3
+1 Еще более запутанным является тот факт, что это beginIndex INCLUSIVE и endIndex EXCLUSIVE ... и что в JDK есть некоторые API, которые используют startIndex, подход длины ...
Оливер Вейлер
10
  • Вы не получаете LINQ
  • Вы не получаете красивый интерфейс (без WPF)
  • Нет свойств
  • Вы получаете танцы египтян
  • Вы получаете API без примеров и хорошей документации

Гектометр


источник
2
Никогда не находил API Java плохим (на самом деле легче ориентироваться), но примеров явно меньше. Что это за египтяне?
Графен
3
Я голосую за это ...... даже если это саркастический низкий удар.
mpen
8
Это настоящие подводные камни? Я понимаю подводные камни как возможные причины ошибок. Это просто вещи, с которыми вам приходится жить, поскольку вы не можете поступить иначе.
2
@cloudanger: согласен с тобой. Подводные камни должны быть чем-то, что «работает» неправильно, а не тем, что даже не работает.
Vimvq1987
10
  • Перечисления Java намного более мощные / сложные, они на самом деле являются реальными классами, а не именованными целыми числами.
  • внутренние классы в Java являются более мощными (и они ведут себя по-разному)
  • без делегатов, только функциональные объекты
  • в обоих языках синтаксис конструктора имеет совершенно разный синтаксис, я склонен терпеть неудачу каждый раз, когда мне приходится делать это в c #
  • Java имеет расширенные возможности для создания подклассов и реализует интерфейсы, что довольно приятно. Вместо этого C # использует соглашение об именах, согласно которому интерфейсы начинаются с заглавной буквы I в их имени. Мне не нравится это соглашение, так как я никогда не могу быть уверен, что кто-то еще потерпит неудачу.
  • Java Autoboxing может укусить вас в а **
  • стирание Java-типа действительно усложняет ситуацию
atamanroman
источник
2
Вы шутите, верно? -1, однако. Ты не можешь быть серьезным.
3
Вы должны, по крайней мере, прояснить, какой момент вам не нравится, иначе я должен предположить, что вы просто троллируете.
Атаманроман
2
теперь вы не только шутите, но и просто невежественны: linux важен в области бэкэнда, javadoc намного чище, чем эти глупые файлы справки ms, которые не будут работать, если вы просматриваете их с сетевых ресурсов. Сандкасл почти не документирован и совершенно непригоден для использования без надлежащего графического интерфейса. большинство людей согласны с тем, что в java-фреймворке есть действительно хорошие коллекции, и Джошуа Блох хорошо поработал там. А «умные» книги - это просто книги, которые вы не понимаете. Eclipse - это отличная среда разработки, которая не может стоять без внешних плагинов. Кстати: мне нравится C # и мисс linq в Java. Убирайся из своего мира MS-Office.
Атаманроман
1
Только один из этих предметов
гоча
1
-1 От меня тоже, вы не знаете, что такое хорошая идея (и, следовательно, не знаете ничего, связанного с программированием). Редактировать: Pffft Java более зрелый, Java даже не имеет реальных дженериков ..
6

Самая большая мета-ловушка состоит в том, что предполагается, что язык и библиотеки Java ведут себя так же, как похожий материал в C #. Делайте учебные пособия, читайте Javadocs, не предполагайте ...

Еще одна мета-ловушка - предположить, что тот факт, что вы можете делать что-то в Java, так же легко / приятно, как вы можете / могли бы делать в C #. Это не правда. Ява - намного более старый язык, и были допущены ошибки ...

И последняя мета-ловушка заключается в том, что если вы будете жаловаться на то, что в Java на SO отсутствуют какие-либо вещи, вы получите всеобщее сочувствие / поддержку!

Стивен С
источник
3

Остерегайтесь различий в модификаторах доступа по умолчанию. Также обратите внимание, что все нестатические методы в Java являются виртуальными (если вы не пометите их как final).

Хотя это несколько устарело, я обнаружил, что это отличная ссылка.

Сравнение C # и Java от Dare Obasanjo

user5631
источник
3
Also note that all non-static methods in Java are virtual.Как бы я хотел, чтобы C # был таким же
Graphain
3
Я рад, что это не так, поскольку это уничтожает причину ООП. Поскольку каждый метод является виртуальным по умолчанию, вы в основном разрешаете замену всего класса, чего обычно не хотите. Кроме того, изменение метода с нефинала на финал может нарушить создание кода, в то время как другой способ этого не делает.
Femaref
2

зависит от того, над какой программой вы работаете. В Википедии есть эта статья, и она довольно обширна. (также ознакомьтесь с разделом «внешние ссылки» в конце) http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp .

Кроме того, я прочитал эту статью, когда я переключился с C # на Java http://www.25hoursaday.com/CsharpVsJava.html, и это было очень полезно.

Луис Рис
источник
0

Я думаю, что ваш вопрос субъективен. Все не может быть объяснено здесь. Я предлагаю вам прочитать Java Puzzlers , By Joshua Bloch and Neal Gafter. Вы можете узнать больше и быть в безопасности от ловушек.


источник
не все подводные камни, но подводные камни, которые программист C # может сделать в Java :)
Vimvq1987
1
@ Vimvq1987 - нет оснований предполагать, что вы не столкнетесь с ловушками «Java Puzzlers» после перехода на Java.
Стивен С
-1

В языке Java объективные эквиваленты примитивных типов, таких как int, char, не являются «типами значений» (например, Integer является ссылочным типом). В C # System.Int32 является структурой.


источник