Подтвердить что ты не робот

Переход с С# на Java

Я работаю с С# и в более общем плане .Net framework уже пару лет. Я часто слышал о сходстве между С# и языком Java и хотел бы узнать больше о втором.

  • Есть ли у вас какой-либо конкретный совет по изучению Java при выходе из С#?
  • Любые распространенные ошибки, которые программист С# выполнял при запуске Java?
  • Любая документация, показывающая привычки, которые вы можете сохранить, и те, которые вы должны изменить (все еще в опере С# на Java, поэтому что-то более конкретное, чем сравнение С# и Java)?
4b9b3361

Ответ 1

Хорошо, в то время как С# и Java внешне похожи друг на друга, существует ряд небольших отличий, которые могут вас укусить. Вообще, я думаю, что противоположное направление - от Java до С# - менее проблематично. Это в основном связано с тем, что С# является более сложным языком, поэтому вы можете найти много упрощений от обычных шаблонов Java, но наоборот может быть немного болезненным.

Что нужно посмотреть (неполный список, не гарантированный быть исчерпывающим):

  • Разные...

    • Соглашения об именах. В Java только имена типов начинаются с заглавной буквы (например, PascalCase), все остальное использует camelCase. Не очень сложно придерживаться, однако.

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

    • Библиотека классов: -)

      Несмотря на очевидность, именно это я потратил больше всего на изучение языка. Когда речь идет о известной парадигме, различия в синтаксисе быстро сортируются, но знакомство с стандартной библиотекой/библиотекой/структурой библиотеки занимает некоторое время в некоторых случаях: -)

    • Patterns. Ну, не совсем, это все тот же материал. Но С# поддерживает некоторые шаблоны на уровне языка, в то время как вы все равно должны реализовывать их самостоятельно на Java. Нет событий, но шаблон Observer (очень распространенный в Swing - всякий раз, когда вы видите слушателя, вы знаете, что делать: -))
    • Обработка исключений. Java имеет так называемые проверенные исключения, что означает, что исключение должно быть уловлено или объявлено вверх. Обычно это означает, что у вас есть

      catch (SomeException ex) {
        ex.printStackTrace();
      }
      

      довольно часто в вашем коде 1: -)

    • Типы. Хотя .NET имеет обычные объекты и типы значений, они оба являются объектами и методами поддержки, свойствами и т.д. Java имеет дихотомию примитивных типов, таких как int, float, char, & c. и классы, такие как String. Не имеет большого значения, так как они реализовали автоматическое боксирование, но иногда все еще раздражают обертывание int в Integer.
    • Полиморфизм: все методы Java virtual по умолчанию, тогда как методы С# не являются.
  • Незначительные синтаксические различия.
    • foreach (a in b)for (a : b)
    • Различные ключевые слова для доступа. Такие вещи, как internal и protected internal, не существуют. Но неквалифицированные члены видны другим классам в одном пакете (вроде internal, но опять же не совсем).
    • Сравнение строк не выполняется с помощью == в Java. Вы должны использовать .equals(). В то время как в С# == для строк используется равенство значений, в Java == всегда используется ссылочное равенство.
  • Нет...

    • Свойства. В Java это обычно делается с шаблоном Foo getFoo()/void setFoo(Foo foo), который С# автоматически генерирует за спиной при использовании свойств, но вы должны делать это явно на Java. Как правило, чтобы упростить язык, многие вещи на Java являются просто соглашениями. Тем не менее, в большинстве случаев вам лучше придерживаться их: -)
    • Перегрузка оператора. Будучи опасным для праведного программиста, они не были реализованы, опасаясь злоупотребления. Не нужно их слишком часто, даже в С#, но иногда они приятные, а затем вы что-то упускаете.
    • Индексаторы. Вам всегда нужно получить доступ к элементам списка через myList.get(5) вместо синтаксиса типа myList[5]. Однако лишь небольшое неудобство.
    • LINQ (хотя существуют реализации 2 но это не так хорошо интегрировано) или лямбда-функции 3 (в любом случае делегатов нет, но анонимных классов), методов расширения или частичные классы (да, это больно, когда речь идет о Свинге, если вы не очень дисциплинированы) и еще несколько вещей.
    • Многомерные массивы. Вы можете использовать зубчатые массивы (массивы массивов), а также многомерность не существует.
  • Generics - это только время компиляции, только во время выполнения Object остается. Также подстановочные знаки в дженериках могут быть трудно решить иногда, когда компилятор жалуется на все четыре ? в ваших дженериках, имеющих разные типы. (Хотя честно: это был случай, когда мне понадобилась информация о типе во время выполнения в любом случае, поэтому я вернулся к Object s).

Общий совет: возьмите друга с опытом Java и дайте ему взглянуть на ваш код. Хотя он, вероятно, не может рассказать вам все, о чем вам следует позаботиться, когда вы прямо зададите ему этот вопрос, он может прекрасно заметить странные вещи в коде и уведомить вас об этом. Это очень помогло мне изучать Java (хотя сначала я изучил Java, а затем С#, поэтому он может быть другим).


1 Да, я знаю, что многие блоки catch выглядят по-другому, но все же, это, вероятно, архетипический и даже не тот редко.
2Quaere, JaQue, JaQu, Querydsl
3 Там lambdaj. Спасибо, что указали, что Esko.

Ответ 2

Языки сами по себе довольно похожи, не хватает нескольких ключевых слов и Java, в которых отсутствуют некоторые функции, к которым привыкли программисты на С# (свойства, using, reified (не стираемые стили)).

Основная проблема здесь - знание фреймворков, из которых тысячи для Java.

Ответ 3

Я честно считаю, что самым большим препятствием для многих разработчиков С#, пытающихся изучить Java, является изучение новой среды IDE. Visual Studio отлично подходит, и когда вы кодируете на С# в течение длительного периода времени, вы привыкаете к нему. Когда вам приходится переходить на Eclipse или Netbeans, вы внезапно теряетесь. Как установить точку останова? Где ближайшее окно? Как создать приложение для Windows? и т.д. и т.д.... Я знаю, что это звучит безумно, но я говорю вам, люди очень привязаны к своей среде IDE и испытывают трудности с привыканием к новым...

Ответ 4

Основной язык в порядке. Знакомство с библиотеками - это одно, что требует времени. Если вы занимаетесь веб-приложениями, есть LOT, чтобы узнать... эквивалентные технологии для WCF и ASP.net. Вы не говорите, какую область вы работаете в... рабочем столе, сервере или веб-сервере?

Ответ 5

Самая большая разница между С# и Java: на Java все методы virtual. Отсюда причина, по которой такие инструменты, как NUnit и т.д., Пришли из мира Java.

Ответ 6

Честно говоря, если вы компетентный программист на С#, я не верю в то, что вам нужно знать, помимо упаковки и развертывания приложений.

Здесь хорошая ссылка http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp

Ответ 7

Самая большая вещь, которую вам нужно изучить, - это как функциональные функции Greenspun С# на Java. Например, вы можете рассчитывать на создание большого количества интерфейсов только с одним методом, чтобы обойти Java отсутствие лямбда-функций и делегатов.

Ответ 8

Я честно рекомендую Java в двух словах. Большинство книг по внедрению Java/any_other_lang предназначены для совершенно новичков-читателей, объясняющих концепцию цикла для страниц и рекурсии для главы... Вы можете начать писать программы Java в течение двух дней с этой книгой. Конечно, вам понадобится много времени, чтобы понять, что происходит под капотом, и как использовать все доступные рамки. Но как только сам язык освоен, легко обойтись даже с ресурсами Google.

Ответ 9

Я перешел с Java на С# и снова на Java. Я думаю, что синтаксически они очень похожи, и большая часть проблем, которые я испытывал, - это изучение .NET API и обучение их эффективному использованию. Много раз я использовал "синтаксический сахар", записывая свой код, как если бы он был на Java, а затем переводил его на С#. Я потратил много времени на веб-сайте Microsoft, где читал и узнавал об API, который был огромной помощью.