Потокобезопасный класс против служебного класса со всеми статическими методами

Когда я вижу класс, задокументированный как потокобезопасный, я удивляюсь, почему он не был разработан как служебный класс со всеми статическими методами, такими как java.lang.Math и т. Д.

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

Пример 1. Как насчет класса A, который имеет "потокобезопасное поле" S; Я имею в виду, что сам объект 'S' является потокобезопасным. Можем ли мы объявить все методы и поля, такие как S в классе A, статическими.

Я надеюсь, что мое объяснение достаточно ясно. Просьба уточнить.

Примечание. Исключите javabeans, классы, содержащие свойства, и т. Д. Мой вопрос касался классов, которые выполняют некоторые действия, основанные на входных параметрах, и им может понадобиться использовать и другие классы.

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

2 ответа

Решение

Я легко могу представить ситуацию, когда класс должен иметь состояние, но это также требование быть поточно-ориентированным. Я использую очереди для рабочих потоков, например. Он ДОЛЖЕН быть потокобезопасным и определенно должен иметь в нем состояние. (а именно элементы в очереди)

РЕДАКТИРОВАТЬ:

Примечание. Исключите javabeans, классы, содержащие свойства, и т. Д. Мой вопрос касался классов, которые выполняют некоторые действия, основанные на входных параметрах, и им может понадобиться использовать и другие классы.

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

EDIT2:

Я думаю, что вас вводит в заблуждение тот факт, что часто, когда мы видим static мы можем расслабиться о безопасности потоков. (Хотя это не так в каждом случае, просто практическое правило) Хотя безопасность потоков и отсутствие состояний могут идти рука об руку, статика - это ортогональная концепция. Кроме того, statelessnes действительно обеспечивает безопасность потоков, но безопасность потоков не обязательно означает отсутствие потоков. Если бы это было так, вся концепция synchronized было бы ненужным.

Для тестируемости и с static подходит к ОО, как кулак подходит к носу.

Тестируемый код требует, чтобы вы могли СОЗДАТЬ тестируемый объект контролируемым образом. Я не хочу выполнять чей-то код только потому, что он вызывается изнутри объекта, который я тестирую. Я хочу протестировать свой объект изолированно - при условии, что его сотрудники работают нормально. Использование статических методов из некоторых инструментов заставляет меня использовать PowerMock для тестируемости ИЛИ прощаться с изоляцией и выполнять этот код во время тестирования. Powermock - это проблема (поскольку он использует собственный загрузчик классов), поэтому тестирует больше, чем я хочу.

Статический означает процедурный код. Это хорошо иногда, так как процедурный иногда хорошо. Но попробуйте использовать функции ОО (наследование, полиморфизм) со статическими методами, чтобы найти другую причину, когда НЕ использовать static, Простой пример, иллюстрирующий это: http://www.javaworld.com/javaworld/javaqa/2001-05/01-qa-0504-oo.html?page=1 - отнюдь не исчерпывающий, но показывает точку, на которую я надеюсь. Другие примеры перечислены в комментарии @JB Nizet к ответу выше.

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

Другие вопросы по тегам