Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Design, Quality, Testing > Статические (static) методы где использовать


Автор: priam220 4.6.2010, 21:22
Автоматизированное тестирование. Класс Screen описывает окно Веб-приложения. По определенным причинам, мы не используем конструктор. Но испльзуем  метод open() для создания объекта.


как будет правильно работать с этим методом:

Screen screen = Screen.open();  
 т.е. объявить статическим метод и и возвращать объект типа Screen (public static Screen open(){... return new Screen})

либо:

Screen screen = new Screen ();
screen.open();                                              (public void open(){...})


и самое главное, без чего Ваш ответ, не будет ответом, ПОЧЕМУ?  

Заранее спасибо.

Автор: powerOn 4.6.2010, 22:17
Статический метод нельзя переопределить. А это может понадобиться в юнит тесте для подмены реальной реализации на заглушку. Статический метод это зависимость от реализации, а не от абстракции, т.е. нарушение http://en.wikipedia.org/wiki/Dependency_inversion_principle. Его следует использовать с осторожностью. Какие могут быть альтернативы: шаблон "метод фабрики" или использование IoC. Сам же класс на мой взгляд следует разделить на интерфейс Screen и его реализацию ScreenImpl.

Автор: priam220 4.6.2010, 22:24
powerOn,  спасибо тебе за ответ. Я еще обмозгую твои слова, если появится новый вопрос, буду надеятся на такую же оперативность. Еще раз спасибо.

Автор: Старовъръ 5.6.2010, 08:30
1. Вариант со статичеким методом больше похож на SomeClass.getInstance(). 
2. На статические методы так же можно делать заглушки, для этого существуют специальные библиотеки, их работа основана на прокси классах, они используют CGLIB как основу. Но, имхо, это через одно место, лучше использовать best practice приведенные powerOn'ом.
3. Если проводить аналогию с обычным окном, то вполне логично, что оно будет сначала создаваться, а потом (не обязательно сразу) показываться, то есть вызывать open() отдельно - эт нормально.

Автор: powerOn 5.6.2010, 12:43
Цитата(Старовъръ @  5.6.2010,  09:30 Найти цитируемый пост)
На статические методы так же можно делать заглушки, для этого существуют специальные библиотеки, их работа основана на прокси классах, они используют CGLIB как основу. 


угу, http://code.google.com/p/powermock/ например умеет, но это, опять же, когда рефакторинг кода по тем или иным причинам невозможен.

Автор: priam220 7.6.2010, 08:40
Спасибо!

Автор: Sun 7.6.2010, 10:34
priam220, класс Screen можно сделать абстрактным и сделать метод open() абстрактным. Дальше в потомках уже реализовывать его для каждого конкретного экрана.
Код

public abstract class Screen {
  public abstract void open();
}

public class LoginScreen extends Screen {
  public void open() {
    ... some implementation
  }
}

public class MainScreen extends Screen {
  public void open() {
    ... some implementation
  }
}
...
public void someMethod(Screen screen) {
  screen.open();
...
}

LoginScreen loginScreen = new LoginScreen();
someMehtod(loginScreen);
loginScreen.login();
MainScreen mainScreen = new MainScreen();
someMehtod(mainScreen);


Это позволит тебе использовать в качестве параметров методов абстрактный класс Screen и тебе не нужно париться по поводу того какой ты туда скрин передал, у тебя будет всегда вызыватся нужный тебе метод open(). В случае со статическим методом тебе прийдется всегда явно указывать имя класса. Вообщем статический метод для open() - очень плохое решение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)