2015-04-14 3 views
2

Имеет ли смысл расширять класс Java, методы которого все статичны?расширение класса, члены которого все статические

public class Parent{ 
    public static String child1(long numb){...}; 
    public static MyData child2(String str){...}; 
    ... 
} 

public class More extends Parent{...} 
+0

Конечно, в зависимости от ваших потребностей –

+0

Я не вижу, какая разница будет – JGerulskis

+0

@JGerulskis Существует, так как статические методы нельзя переопределить в способе использования методов экземпляра. – hexafraction

ответ

0

Немногим я думаю, что упомянуты ниже:

  1. Если все методы в классе являются статическими вы можете сделать класс одноэлементно это позволит сэкономить много места.
  2. Вы можете использовать template method design pattern очень эффективно, где некоторые наследующие классы могут определять свои конкретные вещи.
  3. Для класса без переменных экземпляра нет необходимости синхронизировать. Таким образом, ваш класс может получить доступ к N потокам, не беспокоясь о параллелизме.
0

Классы с только статическими функциями-членами часто представляют собой классы полезности, т. Е. Они обеспечивают группировку для функций, которые работают с другими связанными объектами. Например, существует класс Files, который предоставляет функции для работы с объектами File и apache commons ArrayUtils, который предоставляет инструменты для работы с T[].

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

Скажет, у вас есть третья партия Foo утилиты, которые вы используете

public class YourFooUtilities { 
    public static void makeAFooSing(Foo f) {...} 
} 

Но вы также должны иметь некоторые внутренние Foo утилит, то вы можете сделать это:

public class MyFooUtilities extends YourFooUtilities { 
    public static void makeAFooDance(Foo f) { ... } 
    public static void makeAFooDanceAndSing(Foo f) { 
     makeAFooDance(f); 
     makeAFooSing(f); 
    } 
} 

Тогда ваше использование YourFooUtilities всегда может быть через MyFooUtilites, давая слой абстракции

static import MyFooUtilities.*; 

public static class MainClass {  
    void doSomething() { 
    Foo f = new Foo(); 
    makeFooDance(f); 
    makeFooSing(f); 
    makeAFooDanceAndSing(f); 
    } 
} 

Это делает ваш код (слегка) менее жестко привязан к стороннему коду.

Смежные вопросы