Можно ли помешать классу использовать метод в Java? - PullRequest
2 голосов
/ 14 февраля 2012

Предположим, у меня есть класс с именем Foo.Этот класс будет изменен многими людьми и будет выводить информацию на консоль.Для этого у нас есть следующий метод:

private void print(String message){ ... }

, который выводит на экран в нужном нам формате.

Однако, просматривая код от других разработчиков, я вижу, что они постоянновместо этого вызовите System.out.println(...)
, что приведет к едва читаемым отпечаткам.

Мой вопрос заключается в следующем: возможно ли предотвратить любое и любое использование System.out.println () в Foo.java?Если да, то как?

Я пытался найти это, но все, что я нашел, было связано с наследованием, которое не имеет отношения к моему вопросу.

Большое спасибо!
NS

РЕДАКТИРОВАТЬ: Я знаю, что все, что мне нужно сделать, чтобы предотвратить использование метода, может быть удалено разработчиком, но мы придерживаемся политики, которая никогда не удаляет код, помеченный //IMPORTANT, поэтому он все еще может бытьиспользуется как сдерживающий фактор.

EDIT2: я знаю, что могу просто сказать разработчикам не делать этого или использовать обзоры кода, чтобы отфильтровать «ошибки», но 1) я уже делаю это, и это стоит многовремени и 2) вопрос в том, возможно ли это или нет, а НЕ как бороться с моими разработчиками.

Ответы [ 6 ]

6 голосов
/ 14 февраля 2012

public методы просто публичныНет никакого способа ограничить доступ к ним.

Этот тип проблемы обычно «решается» путем установки некоторого средства проверки кода, такого как PMD или checkstyle, и интеграции их в сборку с непрерывной интеграцией.Таким образом, нарушения этих вещей будут отправлены по электронной почте кому-то с большим молотком: -)

3 голосов
/ 14 февраля 2012

Хотя было бы предпочтительнее сообщить, что разработчики не должны использовать System.out напрямую, вы можете установить System.out для другого PrintStream, а затем использовать альтернативный PrintStream в приватном методе. Таким образом, когда люди используют System.out.println, они ничего не выводят, но вы все равно сможете использовать альтернативный PrintStream ... что-то вроде того, что они делают здесь: http://halyph.blogspot.com/2011/07/how-to-disable-systemout.html

2 голосов
/ 14 февраля 2012

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

System.setOut(printStream);

Вы также можете убить тех, кто использует System.out.println в производственной среде.

2 голосов
/ 14 февраля 2012

Предварительная фиксация для вашей системы контроля версий (SVN, Git, Mercurial) может grep для использования System.{err,out} и предотвращать фиксацию, если они происходят.

http://stuporglue.org/svn-pre-commit-hook-which-can-syntax-check-all-files/ являетсяпример, который выполняет действие для различных измененных файлов на основе расширения файла для SVN.Вы должны иметь возможность изменить этот пример, чтобы взять пример, основанный на некотором подмножестве файлов Java, и отклонить, если что-то вроде следующего верно

egrep -q '\bSystem\.(err|out)\b'
1 голос
/ 14 февраля 2012

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

1 голос
/ 14 февраля 2012

Нет, невозможно на 100% помешать классу когда-либо использовать определенный метод в Java.

Сказав это ...

Мое предложение заключается в том, чтобы добавить анализ кода в процесс сборки и отменить сборку в любом случае System.out.println. Хорошее место, чтобы начать, если вы заинтересованы в том, чтобы идти по этому маршруту, это проверить PMD .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...