Каковы подводные камни Java noob?

Я рассмотрел несколько вопросов Java на SO. И я должен сказать, что содержание здесь довольно хорошо написано, и Java-ребята на SO могут действительно выкачать ответы.

Но я всегда находил ответы Java для людей Java. Это здорово, но я Java noob. Поэтому мне не очень нравятся работы "Объединенный союз в дисперсии параметров типа" . Вероятно, это удобно по линии, но на данный момент.. это не так.

Итак, Java для noob (исходя из PHP и Python), что такое чит коды?

Если бы вы могли ссылаться на ответ SO (что, вероятно, там, но я не мог найти), или написать, что такое вещи, которые Java делает иначе, чем другие языки? (на базовом уровне)

Некоторые могут назвать это Java Gotchas (я не мог найти официального, хотя)

Ответ 1

Там собрана полуофициальная "gotchas", известная как Java Puzzlers, и задокументирована в книге с тем же именем; вы также можете найти несколько скринкастов в Интернете. Периодически Джошуа Блох и Нил Гаффер хотели представить кучу безвредных проблем и приступить к систематическому устранению любого понятия, которое у вас было, что вы поняли даже самые неопределенные основы языка Java.

В несколько меньшей циничной ноте, если вы хотите избежать многих общих разработок и реализаций, вы можете взглянуть на Эффективный Java, вышеупомянутым Джошуа Блохом, который имеет множество достойных советов о том, как приступить к разработке нескольких важных, но часто плохо написанных аспектов написания компонентов на Java, включая подробное объяснение того, как правильно выполнить контракт equals() и hashCode(), и почему вам следует избегать clone(), как чума.

О, и не сравнивайте строки с оператором ==.

Ответ 3

Небольшой: поиск класса Java в Google и ожидание поиска актуальной информации. Совет: всегда включайте номер версии. Я ищу "входной поток 6", а не "входной поток". Аналогичным образом, остерегайтесь учебников в сети, многие из них устарели.

Ответ 4

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

Для уточнения этого пункта, прочитайте статью 47 в Joshua Bloch. Эффективная Java (2-е изд.): Знать и использовать библиотеки. (Прочитайте всю книгу, пока на ней!;-) Я приведу некоторые из основных советов, которые он дает:

Используя стандартную библиотеку, вы принимаете преимущество экспертов, которые его написали и опыт тех, кто использовал это перед вами.

[...] каждый программист должен быть знаком с содержимым java.lang, java.util и, в меньшей степени, java.io.

В частности, Java Структура коллекций, в java.util, будет чрезвычайно полезна для любого Java-программиста, новичка или нет; он определенно "сокращает усилия по программированию и повышает производительность", как говорит г-н Блох.

Наряду с библиотеками, которые поставляются с самой платформой Java, семейство библиотек Java, о которых стоит упомянуть, Apache Commons. Он охватывает много земли, широко используется и часто продолжается прямо там, где стандартные библиотеки не работают. Кроме того, хотя я еще не использовал их сам, кажется, что Google недавно выпускает некоторые высококачественные Java-библиотеки, которые дополняют платформу Java, такие как Коллекции Google (интересная статья об этом). Изменить: теперь, когда я лучше познакомился с Google Collections, я могу сказать, что библиотека, безусловно, стоит изучить, изучив структуру Java Collections; это похоже на идеальное расширение! Начните с статьи Javalobby, с которой я связался, а также ознакомьтесь с этой презентацией Кевина Бурриллиона, главного разработчика: часть 1 и часть 2.

Ответ 5

Различие между скалярным типом int и коробочным типом Integer является неожиданным для кого-то нового для Java.

Java всегда делала различие между "скалярными" типами, которые не являются классами: boolean (true/false), char (unsigned 16-bit), short (подписанный 16-разрядный), int (подписанный 32-разрядный) и long (подписанный 64-разрядный); и все остальное, что является классом и в конечном итоге выведено из класса Object.

Проблема возникает, когда вы хотите использовать что-то вроде общей коллекции, например List. A List может содержать все, что получено из Object, но не скалярные значения. Поэтому, чтобы сохранить значения int в List, вам необходимо обернуть их в экземпляр класса с именем Integer, который получен из Object.

В старых версиях Java вам также необходимо явно получить значение из класса Integer, используя вызов метода .intValue(). В новых версиях Java это преобразование называется "распаковкой" и в некоторых ситуациях является автоматическим.

Sun имеет короткую страницу об автобоксинге, которая направлена ​​на более опытного программиста, но может быть информативным.

Ответ 6

Закладка javadocs: http://java.sun.com/javase/6/docs/api/index.html

Еще лучше, установите их локально и заклейте страницу на своем локальном компьютере для более быстрого поиска и автономного просмотра.

Ответ 7

Я думаю, что лучшим "чит-кодом" является "Не будь умным, напишите немой код".

Условия несколько загружены, но в основном вы хотите, чтобы все было просто, когда вы их пишете, потому что тогда их будет легко читать, когда вы вернетесь к нему позже. Также в наши дни JVM является намного более умным, чем вы, а не-немой код обычно пытается что-то сделать "более эффективно", что может запретить JVM делать что-то даже более умное.

Посмотрите http://java.sun.com/developer/technicalArticles/Interviews/devinsight_1/

Обратите внимание: нормально писать смарт-код, вам нужно сначала доказать, что это необходимо:)


EDIT: Еще несколько вещей.

  • Напишите много кода. Практика делает совершенным - всегда старайтесь делать это наилучшим образом. Если вы вернетесь к своему коду позже, вы, возможно, узнали что-нибудь или два, поскольку это позволит вам взглянуть на ваши более ранние варианты, позволяя вам сделать лучшее решение в следующий раз, когда вам нужно сделать выбор. ЭТО ВКЛЮЧАЕТ ДОКУМЕНТАЦИЮ! Документация - это то, что позволяет другим использовать ваш код, не понимая его подробно.

  • Прочитайте много кода. Настройте свою среду IDE, чтобы она позволяла вам видеть как можно больше источников, с которыми вы работаете. Используя JDK как JVM в Eclipse, источники автоматически привязаны, чтобы вы могли ПОСМОТРЕТЬ источник для того, что вы попали в точку останова. При включении банки из, например, Apache в вашем коде, включите источники, чтобы вы могли видеть, что он делает. Это поможет вам когда-нибудь, что вы сможете понять, ПОЧЕМУ что-то происходит и как его избежать.

  • Работа со сверстниками. Другие программисты на аналогичном уровне могут вносить вклад в ситуацию - возможно, даже просто слушая ваше объяснение, проясняет ситуацию в вашем уме - и вы также можете им помочь. Работая вместе и оценивая вместе, вы можете использовать друг друга.

  • Учебник по Java от Sun охватывает множество библиотек Java и изучает те, которые охватывают основную часть среды выполнения (java.lang, java.io) наизусть и читают остальное (просто чтобы знать, что существует) сделает вас более опытным программистом. Вы узнаете, что находится в вашем инструменте!

  • Участвуйте в переполнении стека. Написание хороших ответов на вопросы (даже если они были отвечены, но плохо) позволит вам передать свои впечатления в слова, что является практикой для написания документации:)

Ответ 8

Подумайте о запуске FindBugs вашего кода (доступный как Плагин Eclipse). Это может означать множество распространенных ошибок. Поскольку инструменты осмотра идут, я думаю, что это хороший для новичков, потому что он не зацикливается на несущественных деталях.

Ответ 9

Это может быть немного основополагающим советом, поэтому простите меня, если я оскорбляю вас за то, что вы его подняли, но я слишком часто начинал Java-код, который свободно менял ключевое слово static, казалось бы, без обратите внимание на то, для чего это нужно. Поэтому, если вы видите предупреждение, жалующееся на "статическую ссылку на нестатические значения" или на какую-то такую ​​вещь, не пытайтесь ее решить, случайно помещая static на нестационарную вещь, если это имеет смысл делать это.

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

Еще один случайный совет: используйте пакеты. Возможно не начинать ваши .java файлы с помощью строки package com.whatever.foo;, и если вы используете командную строку javac, вы обнаружите, что хорошо, что файлы, лишенные этой строки, отображаются в вашем рабочем каталоге, но это почти всегда оказываются болью позже. И прекратите использование командной строки javac в любом случае. Используйте Eclipse.

Ответ 10

Java - это очень простой язык для начала, если вы уже знакомы с императивным языком C sytle. Глубокие проблемы не связаны конкретно с языком, но более широко связаны со стандартными (и сильно) типизированными, одиночными наследованиями, языками OO.

Я также смиренно не согласен с моими братьями Java здесь и рекомендую вам научиться основам с помощью текстового редактора и командной строки. То есть наиболее важными были конкретные ошибки JVM.

Помните самое важное различие между Java и другими языками: Java - это язык и платформа.

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

Что будет печатать "java", "javac" и т.д., когда вы вводите в командной строке? Изучите основы.

IDE полностью документируют эти фундаментальные проблемы платформы Java.

Я также рекомендую, если вы воспользуетесь этим, прочитать спецификацию языка Java и (да) спецификацию JVM. Удостоверьтесь, что вы загружаете загрузчики классов и связанные с ними проблемы, когда вы начинаете свое путешествие на Java, если Мастерство - это то, что вам нужно.

Ответ 11

Всегда:

String a = "wow, not the same";
String b = "wow, not the same";
String c = new String("wow, not the same");
if (a == b) { //happens to evaluate to true, but you shouldn't do this
    ...
}
if (a == c) { //evaluates to false, which is why you shouldn't do it
    ...
}

//This is how you *should* do this
if (a.equals(b)) { //evaluates to true
    ...
}
if (a.equals(c)) { //evaluates to true
    ...
}

Ответ 12

Используйте Eclipse для редактирования/разработки/отладки Java. Или, может быть, какая-то другая IDE, но ради Бога не используйте Notepad и командную строку.

Ответ 13

Зарегистрируйтесь на JavaBlackBelt и начинайте с этого делать тесты. Как вы можете видеть, просто просматривая первую страницу, они охватывают практически все, от самых простых до невероятно продвинутых тем.

И не стесняйтесь проваливать какие-либо из тестов, а не просто рассказывать, что вам следует больше узнать, прежде чем продолжить:)

Ответ 14

Навязчивая шаблоны проектирования! Я бы не стал слишком беспокоиться о шаблонах дизайна. Хорошо, если вы знаете о своем существовании, чтобы вы знали, о чем говорят другие члены вашей команды, но важно то, что сейчас просто изучать основные Java-API. Когда вы чувствуете себя комфортно с ними, я действительно стараюсь научиться писать чистый и самодокументирующий код. Это сэкономит вам много времени и сил в будущем, когда вы вернетесь и будете помнить, что вы делали.

Ответ 15

Статические финалы могут быть запечены в классе.

то есть.

public class Foo {
  public static final String A_STRING="A_STRING";
}

public class Bar { 
  public void printString() { System.out.println(Foo.A_STRING);}
}

Теперь скомпилируйте оба, затем измените "Foo" и перекомпилируйте Foo, но не Bar. Bar все равно распечатает старое значение A_STRING. Чтобы испытать это для себя, запустите локально в eclipse, который тихо перекомпилирует все ваши классы, а затем сделайте инкрементное обновление на сервере. Эй, куда пошли мои изменения?

Ответ 16

Каковы вещи, которые Java делает иначе, чем другие языки? (на базовом уровне)

На базовом уровне он не отличается от других языков ООП. Однако, по сравнению с простым процедурным программированием, это совершенно новый мир... или развитый.

Ответ 17

Некоторые ошибки, которые я видел, делают люди, которые имеют опыт программирования, но не на Java:

  • Классы неявно расширяют Object
  • Классы неявно импортируют java.lang.*
  • instanceof не требует проверки не с нуля
  • Ускорение, например. ((Object)new Integer(1)).toString(), почти никогда не бывает полезен, так как он не влияет на выбор динамического метода.
  • Строки неизменяемы. Нет необходимости копировать или клонировать их.
  • Не полагайтесь на сборщик мусора или finalize() для управления ресурсами (а не с памятью). Ресурсы, например. файлы, должны быть явно закрыты.
  • Компоненты Swing после отображения должны быть доступны только из потока событий AWT (обычно с помощью SwingUtilities.invokeLater()).
  • В общем, будьте очень осторожны, когда несколько потоков используют одни и те же объекты с изменяемым/состоянием. Либо сначала скопируйте свои объекты, либо будьте готовы использовать небольшую часть блоков synchronized, wait() и notify().

Ответ 18

Я бы сказал.

Одна из наиболее распространенных фраз типа noob, таких как "параметры в методах, всегда передаются как ссылка, потому что переменные объекта являются ссылками, правильно?"

поэтому, когда вы видите что-то вроде:

public void foo(String str){
      str="yeah, this should work!";
}

String str = "";
foo (str);

System.out.println(str);

Вы можете услышать "Wait, WTF!". начиная с нуба.

По моему опыту, java noobs не знают о StringBuffer/StringBuilder. Ни на объектах, не подлежащих уничтожению.

Ответ 19

Другая ошибка: выбор отладчика отладчика и использование отладчика Eclipse, не тратя время на изучение всего этого.

Поскольку вы сказали, что используете Eclipse, существует серия из 7 отличных видеоуроков по отладчику здесь. Я очень рекомендую потратить время (7 * 15 минут), наблюдая за ними.

Ответ 20

Избегайте быть более конкретным, чем вам нужно. Возможно, у вас возникнет соблазн подумать о вашем объекте хранения как о HashMap:

HashMap myStore = new HashMap();

Но я бы рекомендовал подумать об этом только как о карте (интерфейсе):

Map myStore = new Hashtable();

Остальная часть вашего кода не должна знать, как мы реализовали myStore, просто нужно знать, что myStore - это своего рода Карта. Таким образом, мы можем изменить тип реализации позже (HashMap, Hashtable,...), и будет затронута только одна строка кода.

И я выбрал Hashtable в качестве примера, над HashMap, потому что Hashtable является потокобезопасным. В многопоточном приложении это позволяет избежать проблемы, что два потока, считывающих и изменяющих один и тот же HashMap, могут одновременно запускать исключения.

Ответ 21

Убедитесь, что вы понимаете ООП, а не статируете все. И узнайте о переполнении стека, чтобы задать вопросы: -).

Ответ 22

Объединение equals() с автобоксингом может стать действительно сумасшедшим:

Integer X = 9000;
Integer Z = 9000;
short y = 9000;
boolean b1 = (X == Z);  
boolean b2 = (X == y);    
boolean b3 = (X.equals(Z));
boolean b4 = (X.equals(y));
System.out.println(b1 + " " + b2 + " " + b3 + " " + b4);

выходы:

false true true false

Ответ 23

По моему опыту, люди, новые для Java никогда не переопределяют методы equals, hashCode и toString, а не те объекты, которые являются объектами. Также никто не беспокоится о настройке простой системы ведения журнала. Когда я вижу System.out.println, я чувствую, что готов сломать пальцы! Но много закаленных кодеров ставят штырь в тысячи задач.

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