Каковы подводные камни в нубе Java? [закрыто]

, на мой взгляд, но на всякий случай, если ваша программа php-кода написана для автономной модели ... лучшие решения: c) Вы можете обернуть php в контейнер, например Phalanger (.NET). поскольку все знают, что это тесно связано с системой, особенно если ваша программа предназначена для пользователей Windows. вы просто можете сделать свой собственный алгоритм защиты на языке программирования Windows, например .NET / VB / C #, или что вы знаете в .NET prog.lang.family.

23
задан 2 revs 23 May 2017 в 11:52
поделиться

22 ответа

There's a collection of semi-official "gotchas", known as the Java Puzzlers, and documented in a book of the same name; you might also find a few screencasts on the web. Periodically, Joshua Bloch and Neal Gafter like to present a bunch of innocuous-looking challenges and proceed to systematically remove any notion you had that you understood even the vaguest basics of the Java language.

On a slightly less cynical note, if you're looking to avoid many of the common design and implementation cock-ups, you might take a look at Effective Java, by the aforementioned Joshua Bloch, which has a wealth of decent advice on how to go about designing several of the important - but frequently badly written - aspects of writing components in Java, including a comprehensive explanation of how to properly implement the contract of equals() and hashCode(), and why you should avoid clone() like the plague.

Oh, and don't compare strings with the == operator.

16
ответ дан 29 November 2019 в 00:36
поделиться

Avoid being more specific than you need to. You might be tempted to think of your storage object as a HashMap:

HashMap myStore = new HashMap();

But I would recommend thinking of it only as a Map (interface):

Map myStore = new Hashtable();

The rest of your code does not need to know how we implemented myStore, it just needs to know that myStore is some kind of Map. This way we can change the implementing type later (HashMap,Hashtable,...), and only one line of code will be affected.

And I chose Hashtable as an example, over HashMap, because Hashtable is thread-safe. In a multi-threaded app, this avoids the problem that two threads reading and changing the same HashMap concurrently can start throwing Exceptions.

2
ответ дан 29 November 2019 в 00:36
поделиться

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

т.е.

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. Бар все равно распечатает старое значение A_STRING. Чтобы убедиться в этом сами, запустите локально в eclipse, который автоматически перекомпилирует все ваши классы, а затем выполните инкрементное обновление на сервере. Эй, куда делись мои изменения?

5
ответ дан 29 November 2019 в 00:36
поделиться

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

5
ответ дан 29 November 2019 в 00:36
поделиться

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

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

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

8
ответ дан 29 November 2019 в 00:36
поделиться

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

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

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

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

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

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

10
ответ дан 29 November 2019 в 00:36
поделиться

what are the things Java does differently than other languages? (on a basic level)

On a basic level it's not different to other OOP language. However, comparing to plain procedural programming it's a whole new world... or a evolved one.

4
ответ дан 29 November 2019 в 00:36
поделиться

There's always:

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
    ...
}
5
ответ дан 29 November 2019 в 00:36
поделиться

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

5
ответ дан 29 November 2019 в 00:36
поделиться

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

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

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

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

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

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

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

7
ответ дан 29 November 2019 в 00:36
поделиться

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

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

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

s package-private, и нет ключевого слова, определяющего его, кроме отсутствия ключевого слова. Частные объекты пакета действуют как частные значения для всего в другом пакете и общедоступные для вещей, находящихся в том же пакете.

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

s package-private, и нет ключевого слова, определяющего его, кроме отсутствия ключевого слова. Частные объекты пакета действуют как частные значения для всего в другом пакете и общедоступные для вещей, находящихся в том же пакете.

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

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

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

7
ответ дан 29 November 2019 в 00:36
поделиться

Добавить javadocs в закладки: http://java.sun.com/javase/6/docs/api/index.html

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

10
ответ дан 29 November 2019 в 00:36
поделиться

Разница между скалярным типом int и упакованным в коробку типом Integer удивительна для тех, кто плохо знаком с Java.

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

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

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

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

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

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

9
ответ дан 29 November 2019 в 00:36
поделиться

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

10
ответ дан 29 November 2019 в 00:36
поделиться

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

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

2
ответ дан 29 November 2019 в 00:36
поделиться

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

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

5
ответ дан 29 November 2019 в 00:36
поделиться

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

Одна из самых распространенных фраз о ловушках новичков вроде «параметры методов всегда передаются как ссылки, потому что объектные переменные - это ссылки, верно?»

так что когда вы видите что-то вроде:

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

String str = "";
foo (str);

System.out.println(str);

Вы можете услышать "Подожди, WTF!" исходящий от новичка.

По моему опыту, java-новички не знают о StringBuffer / StringBuilder. Ни на неизменяемых объектах.

3
ответ дан 29 November 2019 в 00:36
поделиться

Говоря, что объекты передаются по ссылке.

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

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

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

14
ответ дан 29 November 2019 в 00:36
поделиться

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

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

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

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


РЕДАКТИРОВАТЬ: Еще несколько вещей.

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

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

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

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

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

8
ответ дан 29 November 2019 в 00:36
поделиться

Комбинирование 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
2
ответ дан 29 November 2019 в 00:36
поделиться

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

2
ответ дан 29 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

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