Что есть в Java, чего нет в C#? [закрыт]

1,00
р.



Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.





Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 3 года назад.



Улучшить вопрос

Решил попробовать писать под андроид и столкнулся с необходимостью писать на Java. До этого писал больше на C#. Языки похожие во многом, но есть и отличия. И так как пока я C# знаю лучше Java, то так получается, что я пользуюсь только теми возможностями синтаксиса Java, которые знаю по C#. В общем, сейчас для меня java превратился в "урезаный C#", потому что каких-то чисто джавовских "фишек" я не знаю, а некоторых возможностей из C# в этом языке нет. Ну, например, в Java нет оператора ??, нет linq, нет свойств, нет атрибутов.
Так вот сам вопрос: а что есть в Java, чего нет в C#? Именно из синтаксиса, различных удобностей и синтаксического сахара.

Ответ
Смотрите.
В основном по фичам в данный момент C# идёт впереди Java, Java находится в позиции догоняющего. Однако есть несколько фич, которые есть в Java и нет в C# и которые при правильном использовании могут облегчить жизнь программисту.
1) Легковесные (анонимные) производные классы.
Пример:
new Thread(new Runnable() { // это анонимный производный класс! @override public void run() { // do some work } }).start()
В C# надо было бы объявить производный класс явно. Аналогичная, но не равносильная фича C# — анонимные методы, то есть лямбды.
2) Нестатические внутренние классы. В C# внутренние классы лишь логически находятся «внутри» и не имеют доступа к instance-переменным. В Java внутренние классы более богаты.
3) enum'ы. В C# они такие же, как в C++, и являются по существу именованными константами целочисленного типа. В Java enum'ы есть константы объектного типа, гораздо более богатые семантически.
4) checked exceptions. Вы можете объявлять как часть сигнатуры метода исключения, которые бросаются этим методом. В C# такой возможности нету. (Хотя разработчики C# считают, что эта фича не нужна и даже вредна, тем не менее по факту это фича, которая есть в Java и нет в C#.)
5) final-параметры. В C# const могут лишь переменные и поля, в Java можно параметр объявить как final, и при попытке его изменить компилятор наругается на вас.
6) SoftReference представляет собой «более сильную» версию WeakReference (которые тоже есть в Java): объекты, референсируемые ими, не удаляются, пока памяти хватает, даже если другие объекты уничтожаются в процессе сборки мусора.
7) У Java есть симпатичные помеченные блоки, которые позволяют выйти из любого количества циклов за раз (break) или пропустить итерацию во внешнем цикле (continue). Также break может выйти из любого блока, не только цикла (что делает его равносильным goto).
8) В Java вы можете ловить в одном catch несколько исключений: catch (IOException | SQLException ex). C# такое не умеет.

С выходом новой версии Java 8 добавилось ещё одно расхождение:
9) У Java есть очень полезная фича: default interface implementation, с помощью которой можно устраивать подобие mixin'ов: написать код, который можно добавить к любому классу, с возможностью перегрузки.
У C# похожее поведение можно смоделировать при помощи extension-методов (которых в Java как раз нет) и маркерных интерфейсов, но вы не сможете полиморфно перегрузить метод в конкретном классе, только перекрыть. В результате если у вас есть указатель на базовый класс, вызов в случае C# приведёт к вызову метода для базового класса.