В основном работая с С#, я склонен думать о функциях С#, которые недоступны на Java. После активной работы с Java за последний год я начал открывать функции Java, которые, как мне хотелось бы, были на С#. Ниже приведен список тех, о которых я знаю. Может ли кто-нибудь подумать о других функциях языка Java, которые человек с фоном С# не может реализовать?
Статьи http://www.25hoursaday.com/CsharpVsJava.html и http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp дайте очень обширный список различий между Java и С#, но мне интересно, пропустил ли я что-нибудь в (очень) длинных статьях. Я также могу вспомнить одну особенность (ковариантный тип возврата), которую я не видел в обеих статьях.
Пожалуйста, ограничьте ответы на языковые или основные функции библиотеки, которые не могут быть эффективно реализованы вашим собственным кодом или сторонними библиотеками.
-
Возвращаемый тип Covariant - метод может быть переопределен методом, который возвращает более конкретный тип. Полезно при реализации интерфейса или расширения класса, и вы хотите, чтобы переопределяющий метод возвращал тип, более специфичный для вашего класса. Это можно моделировать, используя явную реализацию интерфейса в С#, но нет простого эквивалента при переопределении методов класса.
-
Перечисления - это классы - перечисление представляет собой полный класс в java, а не оболочку вокруг примитива, например, в .Net. Java позволяет вам определять поля и методы для перечисления.
-
Анонимные внутренние классы - определяют анонимный класс, который реализует метод. Хотя большинство случаев использования этого в Java охватываются делегатами в .Net, есть некоторые случаи, когда вам действительно нужно передать несколько обратных вызовов как группу. Было бы неплохо иметь выбор использования анонимного внутреннего класса.
-
Проверенные исключения - я вижу, как это полезно в контексте общих проектов, используемых с Java-приложениями, но мой опыт работы с .Net заставил меня привыкнуть использовать исключения только для неустранимых условий. И.Е. исключения указывают на ошибку в приложении и попадают только в целях ведения журнала. Я не совсем понял идею использования исключений для нормального потока программы.
-
strictfp - обеспечивает строгую арифметику с плавающей запятой. Я не уверен, какие приложения найдут это полезным.
-
поля в интерфейсах - возможно объявлять поля в интерфейсах. Я никогда не использовал это.
-
статический импорт. Позволяет использовать статические методы класса без квалификации его с именем класса. Сегодня я понял, что эта функция существует. Это звучит как приятное удобство.