Каковы некоторые распространенные ошибки / ошибки Java для программиста C ++? - PullRequest
7 голосов
/ 12 января 2009

Как следует из вопроса, с какими общими / основными проблемами сталкиваются программисты C ++ при переходе на Java? Я ищу некоторые широкие названия тем или примеры и ежедневные корректировки, которые должны были сделать инженеры. Затем я могу пойти и сделать подробное чтение по этому вопросу.

Меня особенно интересуют мнения инженеров, которые годами работали в C ++ и должны были работать с Java, но любые указания от других или даже рекомендации книг более чем приветствуются.

Ответы [ 14 ]

15 голосов
/ 12 января 2009
  • В C ++ вы использовали бы деструкторы для очистки файловых дескрипторов, соединений с базой данных и тому подобного. Наивным эквивалентом является использование финализаторов. Не. Когда-либо.

Вместо этого используйте этот шаблон:

OutputStream os;
try {
  os = ... 
  // do stuff
} finally {
  try { os.close(); } catch (Exception e) { }
}

В конечном итоге вы будете много чего делать.

  • Если вы не укажете модификатор доступа, в Java члены являются частными по умолчанию , в отличие от C ++, в котором они являются закрытыми. Package-private - это раздражающий уровень доступа, означающий, что он является личным, но к нему может обращаться любой объект из того же пакета (это идиотский уровень доступа по умолчанию imho);
  • Нет разделения стека / кучи. Все создается в куче (ну, это не совсем верно, но мы притворимся, что это так);
  • Нет передачи по ссылке;
  • Эквивалентом указателей на функции являются анонимные интерфейсы.
7 голосов
/ 12 января 2009

Моим самым большим препятствием при переходе от C ++ к Java было отказ от процедурного кода. Я очень привык связывать все мои объекты вместе в рамках процедур. Без процедурного кода в Java, я сделал круговые ссылки везде. Мне нужно было научиться вызывать объекты из объектов, не будучи зависимыми друг от друга. Это было самое большое препятствие, но его было легче преодолеть.

Номер 2, личная проблема - документация. JavaDoc полезен, но многие Java-проекты ошибочно полагают, что все, что нужно, - это JavaDoc. Я видел намного лучшую документацию в проектах C ++. Это может быть просто личное предпочтение документации вне кода.

Номер 3. На самом деле в java есть указатели , только арифметика указателей . В Java они называются ссылками . Не думайте, что вы можете игнорировать, куда все указывает, это вернется с большим укусом.

  • == и .equals не равны.

  • == будет смотреть на указатель (ссылку), в то время как .equals будет смотреть на значение, на которое указывает ссылка.

5 голосов
/ 25 февраля 2010

Создание ссылки случайно, когда кто-то думал о конструкторе копирования:

myClass me = new myClass();
myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */
somebodyElse.setPhoneNumber(5551234);
/* Hey... how come my phone doesn't work anymore?!?!?  */
5 голосов
/ 12 января 2009

Поскольку вы упомянули рекомендации книг, обязательно прочитайте Эффективная Java, 2-е изд. - здесь рассматриваются большинство подводных камней, которые я видел в ответах.

5 голосов
/ 12 января 2009

Обобщения (вместо шаблонов), в частности, как они были реализованы с использованием стирания типа .

4 голосов
/ 12 января 2009
  • Нет множественного наследования, и каждый класс неявно наследуется от java.lang.Object (в котором есть ряд важных методов, которые вы обязательно должны знать и понимать)
  • Вы можете иметь своего рода множественное наследование, реализуя интерфейсы
  • Оператор не перегружен, кроме '+' (для строк), и, безусловно, вы не можете это сделать самостоятельно
  • Нет числовых типов без знака, кроме символа, который не должен использоваться в качестве числового типа. Если вам приходится иметь дело с неподписанными типами, вам приходится много раз кастовать и маскировать.
  • Строки не заканчиваются нулем, вместо этого они основаны на массивах символов и как таковые являются неизменяемыми. Как следствие этого, построение длинной строки путем добавления + = в цикле - это O (n ^ 2), так что не делайте этого; вместо этого используйте StringBuilder.
3 голосов
/ 12 января 2009

Привыкаю к ​​сборщику мусора. Невозможность использовать деструктор для очистки ресурсов, которые не обрабатываются GC.

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

Нет конструктора копирования, если только у вас нет необходимости клонировать. Нет оператора присваивания.

Все методы являются виртуальными по умолчанию, что противоположно C ++.

Явная языковая поддержка интерфейсов - чисто виртуальные классы в C ++.

2 голосов
/ 25 февраля 2010

В Java нет объектов, есть только ссылки на объекты. Например:

MyClass myClass;   // no object is created unlike C++.

Но:

MyClass myClass = new MyClass();   // Now it is a valid java object reference.
2 голосов
/ 12 января 2009

Моей худшей проблемой было постоянно помнить о владении памятью. В C ++ это необходимо сделать, и это создает в сознании разработчика некоторые шаблоны, которые трудно преодолеть. В Java я могу забыть об этом (во всяком случае, в очень высокой степени), и это позволяет использовать некоторые алгоритмы и подходы, которые будут чрезвычайно неудобны в C ++.

2 голосов
/ 12 января 2009

Меня поразили небольшие крошечные синтаксические различия. Отсутствие деструкторов.

С другой стороны, возможность написать основной файл для каждого класса (очень удобный или тестируемый) очень хорош; после того, как вы к этому привыкнете, структура и трюки, доступные в jar-файлах, действительно хороши; тот факт, что семантика полностью определена (например, int везде одинакова), действительно хорош.

...