Алгоритм ethash

Описание

Говоря о третьем издании книги Эффективное программирование на Java, третье издание, достаточно упомянуть его автора — Джошуа Блоха — и это будет наилучшей ее рекомендацией.

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

К программированию в полной мере относится фраза Евклида о том, что в геометрии нет царских путей. Но пройти путь изучения и освоения языка программирования вам может помочь проводник, показывающий наиболее интересные места и предупреждающий о ямах и ухабах. Таким проводником может послужить книга Джошуа Блоха. С ней вы не заблудитесь и не забредете в дебри, из которых будете долго и трудно выбираться с помощью отладчика.

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

Эта книга заставляет вас не просто заучить правила — она заставляет думать.

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

Язык программирования Java существенно изменился со времени предыдущего издания книги, опубликованного вскоре после выпуска Java 6. Этот классический труд тщательно обновлен, чтобы читатели могли в полной мере воспользоваться возможностями последних версий языка и его библиотек функций. В современном Java поддерживается несколько парадигм программирования. Поэтому программисты часто испытывают потребность в конкретных рекомендациях, которые и описаны в данной книге.

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

Третье издание охватывает особенности языка программирования и библиотек, появившихся в Java 7, 8 и 9, в том числе конструкции функционального программирования, добавленные к своим объектно-ориентированным корням. В книгу включены также многие новые советы, а также глава, посвященная лямбда-выражениям и потокам.

5 ответов

Лучший ответ

Вам просто нужно накапливать свои знания. Отчасти это происходит благодаря чтению хороших книг, из которых книга Джоша Блоха — очень хорошая книга. Некоторые из них заключаются в том, чтобы в свободное время заниматься программированием и следить за блогами и другими веб-сайтами, такими как stackoverflow. А кое-что из этого вы получите через другой практический опыт, то есть на работе.

Это требует времени и опыта. Просто наслаждайтесь языком и погрузитесь в него. Шаблоны — это не все и не конец всего языка, но они являются частью эффективного инструментария. Лучше понять язык полностью, тогда вы увидите, как шаблоны проектирования могут помочь решить общие проблемы, а зачастую и лучше. Но определенно не зацикливайтесь на шаблонах, пока вы не научитесь достаточно хорошо язык. Если правда, то вообще не зацикливайтесь на шаблонах!

Я бы сказал, что книга Джоша Блоха — лучшая книга, на которой можно сосредоточиться на первом — она ​​превосходна и знакомит вас со всеми ключевыми концепциями (общие методы, такие как equals и hashcode, enums, concurrency), а также знакомит с шаблонами, которые вы получите днем сегодня преимущества, например, Строитель шаблон.

11

planetjones
6 Май 2011 в 19:21

Две книги дополняют друг друга. Эффективная Java — это лучшие практики написания кода Java. Шаблоны дизайна описывают набор стандартных решений общих проблем программного обеспечения. Шаблоны проектирования действительно не зависят от языка, в то время как эффективная Java явно ориентирована на язык java.

Но мой общий подход — «всегда соглашаться с Джошем Блохом» (если только Джон Скит с ним не согласен).

4

DaveH
6 Май 2011 в 19:16

Мой единственный совет — избегайте излишних затрат и чрезмерной инженерии . Некоторые опытные программисты ООП (и Java), которые изучают шаблоны дизайна, принимая их, как Библию, часто создают нечеткий и бесполезный код. Это кажется противоречивым, но если задуматься, это не так.

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

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

Много раз я видел рост классов и интерфейсов, бесполезные обобщения, которые бессмысленны: в некоторых случаях я видел пакеты с 2 полезными классами и 10 интерфейсами и / или абстрактными классами. Я тоже чувствую необходимость сделать код «универсальным» и «многоразовым», но должен быть предел.

Я много раз видел «религиозные войны» по этим темам.

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

8

gd1
6 Май 2011 в 19:30

Шаблон дизайна не всегда хорош. Чрезмерное использование шаблона проектирования — это плохо.

Однако Джош Блох всегда прав. Доверьтесь ему, и вы спасены.

Забудьте о шаблонах дизайна. Книга Джоша Блоха дает вам все необходимые шаблоны.

Kai Wang
20 Сен 2017 в 19:50

Шаблоны программирования — это лучшие практики. Их следует использовать экономно. Каждый шаблон дизайна пытается обработать ту или иную форму вариации.

Например, шаблон стратегии учитывает вариант реализации, который, по сути, является причудливым способом сказать, что это метод plug and play.

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

Может быть, вы захотите взять книгу «Прикладные шаблоны Java» рядом с теми книгами, которые у вас уже есть. Это написано Олавом Маарсеном и Стивеном Стелтингом. Кроме того, корнем всех паттернов является «Банда четырех», вы также можете использовать их книгу в качестве справочника.

2

G-Man
6 Май 2011 в 19:17

5 ответов

Лучший ответ

Вы можете использовать шаблон Factory для создания синглтона и переключать реализации в зависимости от среды.

Или избегайте использования одноэлементного шаблона и вместо этого используйте внедрение зависимостей.

6

Joel
30 Апр 2011 в 14:14

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

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

simpatico
30 Апр 2011 в 19:17

Вы можете внедрить синглтон с помощью зависимости, переопределить getInstance () из кода модульного теста, использовать аспектно-ориентированное программирование для перехвата вызова метода и возврата другого объекта или использовать такой инструмент, как jmockit, который позволяет имитировать практически все, включая статику, финальные классы, конструкторы и все, что люди обычно называют« непроверяемыми ».

Один из подходов, который я использовал в устаревших системах (где я хотел сделать что-то тестируемое с минимальным влиянием на архитектуру системы), заключался в изменении фабричных методов (getInstance), чтобы проверить системное свойство для альтернативной реализации, которую я бы вместо этого создал. Это было установлено как альтернативный фиктивный объект в наборе модульных тестов.

Что касается оператора «двойная проверка блокировки нарушена», это уже неверно, если вы используете ключевое слово volatile и Java> = 1.5. Он был сломан (даже с volatile) в 1.4 и ранее, но если вы знаете, что ваш код будет запускаться только на последних JVM, я бы не стал беспокоиться об этом. Но я бы все равно не стал использовать синглтон: наличие контейнера DI / IOC, управляющего жизненным циклом объекта, решило бы обе ваши проблемы (тестируемость и узкое место синхронизированного доступа) гораздо более элегантно.

2

Lawrence McAlpin
30 Апр 2011 в 18:15

Блокировка с двойной проверкой нарушена на всех языках, а не только на Java.

Я стараюсь избегать синглтонов, но вы можете использовать шаблон держателя, если они вам нужны, как рекомендовано в книге Джоша Блоха Эффективная Java :

РЕДАКТИРОВАТЬ: исправлена ​​ссылка.

4

Lew Bloch
13 Янв 2017 в 20:07

Вы можете использовать перечисление как синглтон

Допустим, ваш синглтон делает что-то нежелательное в модульных тестах.

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

Изменить: если вы используете только , это может не инициализировать класс. В этом примере с обновлением 112 для Java 8 этого не происходит.

Отпечатки

12

Peter Lawrey
15 Янв 2017 в 21:57

Примечания для тех, кто наследует этот метод

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

Для классов, производных от Object , метод может делегировать реализацию базового класса только в том случае, если производный класс определяет равенство на равенство ссылок. Реализация по умолчанию для ссылочных типов возвращает хэш-код, эквивалентный тому, который возвращается методом. Для неизменяемых ссылочных типов можно переопределить. Как правило, для изменяемых ссылочных типов следует переопределить только в том случае, если:
— Хэш-код можно вычислить из полей, которые не являются изменяемыми. ни
— Можно гарантировать, что хэш-код изменяемого объекта не изменится, пока объект содержится в коллекции, зависящей от его хэш-кода.

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

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

Дополнительные сведения и примеры, которые вычисляют хэш-коды различными способами, см. в разделе «примеры».

Хэш-функция должна иметь следующие свойства:
— Если два объекта сравнивают как равные, метод для каждого объекта должен возвращать одно и то же значение. Однако если два объекта не равны как равные, то методы для этих двух объектов не должны возвращать разные значения.

— Метод для объекта должен постоянно возвращать тот же хэш-код, если в состоянии объекта нет изменений, определяющих возвращаемое значение метода System. Object. Equals объекта

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

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

-Функции хэширования должны быть недорогими для вычислений.

— Метод не должен создавать исключения.

Например, реализация метода, предоставляемого String классом, возвращает идентичные хэш-коды для одинаковых строковых значений. Поэтому два String объекта возвращают один и тот же хэш-код, если они представляют одно и то же строковое значение. Кроме того, метод использует все символы в строке для создания достаточно случайного распределения выходных данных, даже если входные данные кластеризованы в определенные диапазоны (например, многие пользователи могут иметь строки, содержащие только младшие символы ASCII 128, даже если строка может содержать любой из 65 535 символов Юникода).

Предоставление хорошей хэш-функции для класса может значительно повлиять на производительность при добавлении этих объектов в хэш-таблицу. В хэш-таблице с ключами, обеспечивающими хорошую реализацию хэш-функции, поиск элемента занимает постоянное время (например, операция O (1)). В хэш-таблице с плохой реализацией хэш-функции производительность поиска зависит от числа элементов в хэш-таблице (например, операции O ( ), где — число элементов в хэш-таблице). Пользователь-злоумышленник может вводить данные, увеличивающие количество конфликтов, что может значительно снизить производительность приложений, зависящих от хэш-таблиц, при следующих условиях.
— Когда хэш-функции вызывают частые конфликты.

— Когда большая часть объектов в хэш-таблице создает хэш-коды, которые равны или приблизительно равны друг другу.

— При вводе пользователями данных, из которых вычисляются хэш-код.

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: