Распространенной ошибкой является (или, надеюсь, была) создание класса, содержащего общие static
методы, а затем использование наследования для возможности легкого доступа к методам классами, которым требуются методы.
Итак, у вас будет:
class Utility {
static utilityMethod() {
// do something usefull
}
}
class Application extends Utility {
someMethod() {
utilityMethod();
}
}
Однако это нарушает принципы объектно-ориентированного подхода, поскольку ApplicationClass
никогда не предполагалось, что он будет подклассом класса UtilityClass
. Вместо этого вы должны использовать:
final class Utility {
Utility() {
// avoid instantiation
}
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
UtilityClass.utilityMethod();
}
}
Разработчики языка Java используют несколько способов, чтобы сделать вышеизложенное более привлекательным для использования. Одним из них является понятие статического импорта. Другой — сделать возможным определение статических методов для интерфейсов. В этом случае вышеприведенное станет:
import static Utility.utilityMethod;
final interface Utility {
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
utilityMethod();
}
}
Что намного короче, тем более что большинство импортов автоматически обрабатывается IDE. Еще несколько обсуждений/указателей вышеизложенного можно найти здесь. Обратите внимание, что до Java 7 включительно вы не можете объявлять статические методы в интерфейсе.
person
Maarten Bodewes
schedule
22.06.2013