Отказ от ответственности: Этот вопрос задан как тот, кто рассмотрит совет Скотта Мейерса в пункте 23 Эффективного C++, который будет хорошим дизайном OO - по крайней мере, на C++.Предпочитаете функции non-member non-friend ... в Java?
В Java, где глобальных функций не существует, сначала может показаться, что этот принцип неприменим, но мне кажется, что это так. Соберите собственный пример Скотта Мейерса.
public class WebBrowser {
public void clearCache() {}
public void clearHistory() {}
public void removeCookies() {}
}
Пути создания ассоциированного «пространство имен» класс, содержащего удобный метод статического , я увеличил инкапсуляцию WebBrowser
путем сведения к минимуму объема кода, который может получить доступ к его внутренности. В конце концов, статические методы в Java являются по существу глобальными функциями (предполагая, что все в классе является общедоступным и статическим).
public class WebBrowserStuff {
private WebBrowserStuff() {} // prevent instantiation
public static void clearBrowser(WebBrowser browser) {
browser.clearCache();
browser.clearHistory();
browser.clearRemoveCookies();
}
}
Единственный недостаток я вижу в том, что нет ни одного аргумента, зависящих от поиска в Java, так что вызов метода является немного более многословным.
WebBrowserStuff.clearBrowser(browser);
Мой вопрос, учитывая, что это использование функций, не являющиеся членов желательно в C++ (см моего отказа от ответственности), есть какая-либо причина, кроме повышенного многословия, почему вы не хотели бы сделать это в Java ? Этот вопрос конкретно касается разницы между C++ и Java в отношении этой техники.
Я не интересно услышать личные мнения относительно того, или нет, как правило, хороший объектно-ориентированного дизайна, хотя я утра интересно услышать, есть ли какие-либо культурные различия между C++ и Java, которые могут вызвать общее мнение опираться так или иначе.
[EDIT]
К сожалению, я действительно не получить ответ на мой вопрос, мой редактировать, чтобы попытаться сделать его менее на основе мнений, не помешало ему быть закрыты, так что я не могу выберите принятый ответ. Можно было бы интерпретировать это как то, что на самом деле нет технической причины, по которой вы не хотели бы этого делать (предполагая, что это хорошая практика на C++), и любое противодействие этому методу является чисто личной или культурной Java-вещью.
Эти классы называются классами помощников, и они часто встречаются, часто считаются плохой практикой. См. Http://blogs.msdn.com/b/nickmalik/archive/2005/09/06/461404.aspx –