При написании программного обеспечения вам часто нужно использовать функцию печати, которая может помочь вам отладить и позиционировать проблему. Но метод Java's Native System.out.println () редко используется в реальной разработке проектов, и даже инструменты проверки кода, такие как Findbugs, будут думать, что использование System.out.println () является ошибкой.
Почему System.out.println (), который является начинающим артефактом Java, будет отвергнут в реальной разработке проекта? На самом деле, пока вы тщательно анализируете его, вы найдете много недостатков. Например, если он не контролируется, все журналы будут напечатаны как обычно после запуска проекта, тем самым снижая операционную эффективность; Вы, чтобы отличить какую категорию, в этом журнал печатается.
Ваш лидер не дурак. Тем не менее, ваш лидер довольно хорош, и он не позволяет вам достичь инструмента для журнала Niubi с различными функциями в начале.
Это требование не сложно для вас.
Общественный класс Logutil { System.out.println (msg);}} public void info (string msg) {if (info> = level) {System.out.println (msg);} public void ing msg) {if (error> = level) {System.out.println (msg);}}}
Распечатайте журнал через этот класс, и необходимо только управлять уровнем уровня, чтобы свободно управлять контентом печати. Например, проект сейчас находится на стадии разработки, и уровень установлен для отладки, так что вся информация о журнале будет напечатана. Если проект находится в Интернете, вы можете установить уровень информации, чтобы вы могли увидеть только журнал и приведенный выше печать журнала. Если вы просто хотите увидеть неправильный журнал, вы можете установить уровень ошибки. И если проект, который вы разрабатываете, является клиентской версией, вы не хотите печатать какой -либо журнал, вы можете установить уровень ни на что. Вам нужно позвонить только при печати:
new Logutil ().
Вы не можете дождаться, чтобы представить этот инструмент своему лидеру.
Но ваш лидер не потребовался много времени, чтобы найти вас, чтобы дать отзывы. Он сказал, что, хотя этот инструмент прост в использовании, он не различает печать таких вещей. Чтобы использовать его для использования.
Как вы думаете, ваш лидер очень разумный, и вы пытаетесь воспользоваться этой возможностью, чтобы практиковать режим проектирования, поэтому вы написали следующий код (PS: код здесь сделан, и я не обращал внимания на Это я не обратил на это внимания.
Общественный класс Logutil {Private Static Logutil GetInstance () {if (logutilInstance == null) {logutilinStance = new Logutil ();} return LogutilInstance;} public void Debug (String G. {if (Debug> = level) {System.out.println (msg);} } Public void info (String msg) {if (info> = level) {System.out.println (msg);} public void erry (String msg) {if (erry> = level) {System .out );}} Public static void main (string [] args) {logutil.getInstance ().
Прежде всего, конструктор Logutil приватизирован, так что новое ключевое слово нельзя использовать для создания экземпляра Logutil. Затем используйте частную статическую переменную для сохранения экземпляра, и предоставьте общественный метод GetInstance для получения экземпляра Logutil. Слогутил напрямую. Это может гарантировать, что в памяти будет только экземпляр Logutil. Одиночный режим завершен! В настоящее время код журнала печати должен быть изменен на следующее:
Logutil.getinstance ().
Вы показываете эту версию своему лидеру.
Вы полны подозрений, разве режим одного -пример не реализован таким образом? Что может быть ошибка?
Ваш лидер побуждает вас, что использование режима одиночных игр состоит в том, чтобы этот класс был только в одном экземпляре в памяти, но считаете ли вы ситуацию печатных журналов в многочисленных? Как показано в следующем коде:
Public static Logutil getInstance () {if (logutilinStance == null) {logutilinStance = new Logutil ();} return LogutilInstance;}
Если в то же время есть два потока, выполняющие метод GetInstance одновременно, первый поток просто выполняет вторую строку и еще не выполняет третью строку. Таким образом, ваш режим одиночных игр не удается, потому что создаются два разных экземпляра.
Вы вдруг понимаете, но ваше мышление очень быстро, и вы сразу же думаете о решении.
Публичный синхронизированный статический logutil getInstance () {if (logutilinstance == null) {logutilinstance = new Logutil ();} return LogutilInstance;}
Таким образом, только один поток разрешается выполнять код в GetInstance одновременно, что эффективно решает ситуацию, когда два экземпляра будут создаваться выше.
Ваш лидер читает ваш новый код и сказал: «Ну, да. Это решает ситуацию, которая может создать два экземпляра, но этот код все еще остается проблемой».
Вы нервничаете, почему есть проблемы?
Ваш лидер улыбнулся: «Не нервничай, на этот раз это не ошибка, но он может быть оптимизирован с точки зрения производительности. Посмотрите, если вы добавите синхронизированный метод в метод GetInstance, то каждый раз, когда я иду на GetInstace Метод, я буду синхронизировать.
Сначала удалите синхронизированное ключевое слово из оператора метода и добавьте его в тело метода:
Public static logutil getInstance () {if (logutilinStance == null) {synchronized (logutil.class) {if (logutilinstance == null) {// может потребоваться, потому что два процесса могут быть прикреплены одновременно в то же время. время одновременно.
После того, как код будет изменен на это, он войдет в третью строку, когда лозунг не будет инициализирован, а затем добавит синхронную блокировку. Как только наносит инициализированная лозунга, он больше не будет переходить к третьей линии, так что метод GetInstance не будет влиять на блокировки синхронизации, и на эффективность будет улучшена в определенной степени.
Вы не можете не восхищаться.
Ваш лидер сразу же стал скромным: «Этот метод называется блокировкой двойной проверки, но я не думаю об этом. Вы можете проверить больше информации в Интернете».
На самом деле, я больше привык использовать режим голодного человека в Java
Характеристикой ленивого стиля является отложенная нагрузка.
Характеристика голодного стиля Хана заключается в том, что он загружен с самого начала, поэтому вы можете вернуться напрямую, когда вы используете его (я рекомендую это еще, потому что нет необходимости рассматривать слишком много проблем безопасности потоков. Конечно, двойные замки упоминается для решения проблемы синхронизации)
Код реализации записей журнала со стилем Hungry Han выглядит следующим образом:
Общедоступный класс () {} Public Static Logutil getInstance () {return LogutilInstance;} public void Debug (String msg) {if (debug> = level) {System.out.print ln (msg);}} public void info (String msg) {if (info> = level) {System.out.println (msg);}} public void error (String msg) {if (error> = level) {System.out.println (msg);} public atic void main main (String [] art) {logutil.getinstance ().