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

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

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

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

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

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

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

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

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

Утверждение, что объекты передаются по ссылке.

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

Java работает только с передачей по значению.

Также стоит прочитать: Is-java-pass-by-reference?

Небольшой: поиск Java-classа в Google и ожидание поиска актуальной информации. Совет: всегда укажите номер версии, т.е. поиск «входной stream 6», а не «входной stream». Точно так же будьте осторожны с учебниками в сети, многие из них устарели.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Взгляните на http://java.sun.com/developer/technicalArticles/Interviews/devinsight_1/

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Всегда есть:

 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 ... } 

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

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

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

Статический финал можно запечь в classе.

т.е.

 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, который тихо перекомпилирует все ваши classы, а затем сделайте инкрементное обновление на сервере. Эй, куда пошли мои изменения?

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

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

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

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

Я должен был сказать.

Одна из наиболее распространенных фраз типа 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. Ни на неинтегрируемых объектах.

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

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

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

 HashMap myStore = new HashMap(); 

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

 Map myStore = new Hashtable(); 

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

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

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

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

 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 

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

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

  • Как узнать использование памяти моего приложения в Android?
  • BroadcastReceiver для ACTION_MEDIA_BUTTON не работает
  • Разница между JSONObject и JSONArray
  • Android - получить реальный путь .txt-файла, выбранного из файла explorer
  • Дублированные записи в ListView
  • Не удалось создать Android Virtual Device
  • Незарегистрированное исключение java.sql.SQLException; должны быть пойманы или объявлены брошенными?
  • Android: укажите два разных изображения для переключателя с использованием XML
  • Selenium - базовая аутентификация через URL-адрес
  • Поиск второго по величине числа в массиве
  • API формата номера телефона Java
  • Давайте будем гением компьютера.