Расширенные темы Java для программиста C # - PullRequest
4 голосов
/ 29 сентября 2010

Я программист на C #, пишу Java (для Android) и имею несколько технических особенностей Java, в которых я до сих пор не уверен, и беспокоюсь, что подхожу под углом C #:

  • Параметры в методах передаются так же, как в C #? (Скопировано для справочных типов)
  • Почему внезапно появился атрибут @Override (я думаю, что это Java 1.5+?)
  • Как можно скомпилировать приложение, если вам не хватает зависимости для одной из используемых вами библиотек?
  • Нужно ли беспокоиться об использовании + = для конкатенации больших строк (например, вместо этого используйте StringBuilder)
  • Есть ли в Java перегрузка операторов: я должен использовать equals() или == по умолчанию. По сути, object.equals примерно такой же, как C # (отражение для типов значений, адресная ссылка для ссылочных типов)

Ответы [ 3 ]

10 голосов
/ 29 сентября 2010

Отвечая по порядку:

  • Да, аргументы передаются по значению в Java, всегда. Это включает ссылки, которые копируются (вместо копируемых объектов ). Обратите внимание, что Java не имеет эквивалента ref или out
  • @ Override позволяет вам ловить опечатки во время компиляции, как модификатор "override" в C #
  • Вы компилируете приложение только для библиотек, которые используете. Там нет транзитивной проверки зависимостей, как нет в .NET.
  • Да, вам следует избегать объединения строк в цикле, как в .NET. Хотя конкатенация с одним оператором хороша, как и в .NET, и снова компилятор выполняет конкатенацию константных выражений во время компиляции, а строковые литералы интернируются.
  • Нет, в Java нет пользовательских перегрузок операторов. В Java нет пользовательских типов значений; == всегда сравнивает примитивное значение или ссылку. (Если вы сравните ссылку Object и примитивное значение, включится автобокс / распаковка, и я никогда не смогу вспомнить, как это работает. Хотя это плохая идея, ИМО.)
4 голосов
/ 29 сентября 2010

Параметры в методах передаются так же, как в C #?(Скопировано для ссылочных типов)

Все первичные типы скопированы, все объекты фактически являются указателями на объекты, указатель копируется, но фактический объект не копируется.

Почему внезапно появился атрибут @Override (я думаю, что это Java 1.5+?)

Нет, начиная с Java 1.6, вы также можете использовать его, чтобы показать, что метод реализует интерфейс.@Override позволяет вам указать компилятору, что, по вашему мнению, вы переопределяете метод, компилятор предупредит вас, когда вы этого не сделаете (на самом деле это очень полезно, особенно если изменяется суперкласс)

Как можно скомпилировать приложение, если вам не хватает зависимости для одной из используемых вами библиотек?

Не думаю, что это так.

Нужно ли беспокоиться об использовании + = для конкатенации больших строк (например, вместо этого используйте StringBuilder)

В некоторых случаях.Компилятор Java + VM очень хорош в автоматическом использовании StringBuilder для вас.Однако это не всегда будет делать это.Я не буду оптимизировать для этого (или что-нибудь) заранее.

Есть ли в Java перегрузка операторов: следует ли использовать equals () или == по умолчанию.По сути, object.equals примерно такой же, как и в C # (отражение для типов значений, адресная ссылка для ссылочных типов)

Нет, оператор не перегружен.

0 голосов
/ 29 сентября 2010

О конкатенации строк Я думаю, это зависит от того, добавляете ли вы статические строки вместе или объединяете ли вы переменные. С переменными лучше использовать StringBuilder. :.)

Итак:

String s = "A";
s += "B";
s += "C";

нормально.

Но здесь лучше с StringBuilder

String s = "A";
s += variable_b;
s += variable_c;
...