Каковы некоторые общие ловушки/глюки Java для программиста на C++?

В соотношении 4: 3 ширина / высота составляет 1,33, а в 16: 9 - 1,77 (16/9), поэтому в соотношении 16: 9 вы увеличиваете ширину окна и вам понадобится больше плиток.

Я надеюсь, что это имеет больше смысла для вас:

9    1.33

x    1.77  

x = 1.77*9/1.33 = 12 
7
задан omermuhammed 11 January 2009 в 22:22
поделиться

13 ответов

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

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

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

Вы закончите тем, что делали материал как этот много.

  • Если Вы не указываете доступа modifer, в Java участники являются частными на пакет по умолчанию, в отличие от C++, в котором они являются частными. Частный на пакет раздражающий уровень доступа, означающий, что это является частным, но что-либо в том же пакете может получить доступ к нему также (который является идиотичным уровнем доступа по умолчанию, по моему скромному мнению);
  • Нет никакого разделения стека/"кучи". Все создается на "куче" (хорошо, это не строго верно, но мы притворимся, что это);
  • Нет никакой передачи ссылкой;
  • Эквивалент указателям функции является анонимными интерфейсами.
15
ответ дан 6 December 2019 в 04:49
поделиться

Лучшей книгой Java "глюки", которые я считал, являются Трудные вопросы Java: Прерывания, Ловушки и Угловые Случаи. Это конкретно не нацелено на разработчиков C++, но это полно примеров вещей, которые Вы хотите высматривать.

1
ответ дан 6 December 2019 в 04:49
поделиться

Все методы являются виртуальными.

Параметризованные типы (дженерики) на самом деле не создают код определенный для параметра код (т.е., List<String> использует тот же байт-код как List<Object>; компилятор является единственной вещью, которая жалуется, пытаетесь ли Вы поместить Integer в первом).

Varargs легок.

0
ответ дан 6 December 2019 в 04:49
поделиться

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

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

2
ответ дан 6 December 2019 в 04:49
поделиться

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

2
ответ дан 6 December 2019 в 04:49
поделиться
  • Никакое множественное наследование и каждый класс неявно не происходят из java.lang. Объект (который имеет много важных методов Вы определенно, должны знать и понять),
  • У Вас может быть своего рода множественное наследование путем реализации интерфейсов
  • Никакой оператор, перегружающийся за исключением '+' (для Строк), и определенно ни один, можно сделать себя
  • Никакие неподписанные числовые типы, кроме символа, который не должен действительно использоваться в качестве числового типа. Если необходимо иметь дело с неподписанными типами, необходимо сделать большой бросок и маскирование.
  • Строки не завершаются пустым указателем, вместо этого они основаны на массивах символов, и как таковой неизменны. В результате этого, создавая длинную строку путем добавления с + = в цикле O (n^2), не делайте этого; используйте StringBuilder вместо этого.
4
ответ дан 6 December 2019 в 04:49
поделиться

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

5
ответ дан 6 December 2019 в 04:49
поделиться

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

5
ответ дан 6 December 2019 в 04:49
поделиться

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

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

Никакой конструктор копии, если у Вас нет потребности клонироваться. Никакой оператор присваивания.

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

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

3
ответ дан 6 December 2019 в 04:49
поделиться

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

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

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

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

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

7
ответ дан 6 December 2019 в 04:49
поделиться

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

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

Но:

MyClass myClass = new MyClass();   // Now it is a valid java object reference.
2
ответ дан 6 December 2019 в 04:49
поделиться

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

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
ответ дан 6 December 2019 в 04:49
поделиться

Указание параметра метода как final не означает то, что вы сначала думаете

private void doSomething(final MyObject myObj){
   ...
   myObj.setSomething("this will change the obj in the calling method too");
   ...
}

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

0
ответ дан 6 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: