Когда я должен написать статические методы? - PullRequest
15 голосов
/ 14 октября 2008

Итак, я понимаю, что такое статический метод или поле, мне просто интересно, когда их использовать. То есть, при написании кода, дизайн подходит для использования статических методов и полей.

Одним из распространенных шаблонов является использование статических методов в качестве статической фабрики, но это также легко сделать путем перегрузки конструктора. Правильный? Например:

var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg");

Что касается статических полей, является ли создание сингелтон-объектов их лучшим использованием?

Ответы [ 8 ]

28 голосов
/ 15 октября 2008

Статические методы обычно полезны для операций, которые не требуют каких-либо данных из экземпляра класса (из this) и могут выполнять свое предназначение исключительно с использованием своих аргументов.
Простым примером этого может служить метод Point::distance(Point a, Point b);, который вычисляет расстояние между двумя точками и не требует экземпляра.

Статические поля полезны среди прочих для констант, которые не так часто меняются и используются всеми экземплярами класса.

16 голосов
/ 15 октября 2008

Это дает лучшее представление о намерении, когда вы используете статическую фабрику - это также позволяет вам иметь разные фабрики, которые принимают одинаковые типы аргументов, но имеют различное значение. Например, представьте, что если у Bitmap есть LoadFromResource (string) - было бы невозможно иметь два конструктора, каждый из которых принимает строку.

РЕДАКТИРОВАТЬ : от stevemegson в комментариях

Статическая фабрика также может возвращать ноль и может легче возвращать экземпляр, полученный из кэша. Многие из моих классов имеют статический FromId (int) для получения экземпляра из первичного ключа, возвращая существующий кэшированный экземпляр, если он у нас есть.

9 голосов
/ 15 октября 2008

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

Чем менее нелокальное состояние зависит от метода, тем легче его понять, поэтому static является полезным сигналом для читателя кода.

7 голосов
/ 15 октября 2008

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

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

Другое хорошее применение для статики: Сравнение (obj a, obj b), Delete (obj a) для объектов данных (объект не может удалить себя, так как его ссылка все еще существует), или статические классы для процедурного кода, который честно не может быть смоделировано в объекте.

2 голосов
/ 15 октября 2008

Вы должны использовать статические методы всякий раз, когда у вас есть функция, которая не зависит от конкретного объекта этого класса.

Добавление статического ключевого слова не повредит: оно не нарушит код, ссылающийся на него. Например, следующий код действителен независимо от того, используется ли у вас ключевое слово static:

class Foo
{
    public Foo(){}
    public static void bar(){}  // valid with or without 'static'
    public void nonStatic(){ bar(); }
}

...
Foo a = new Foo();
a.bar();

Таким образом, вы должны добавить «static» к любым методам, которые можете.

1 голос
/ 15 октября 2008

Вот несколько примеров, когда вы можете использовать статические методы:

1) Когда функция не использует переменные-члены. Вам не нужно использовать статический метод, но обычно это помогает.

2) При использовании фабричных методов для создания объектов. Они особенно необходимы, если вы не знаете тип, который будет создан заранее: например,

class AbstractClass {
    static createObject(int i) {
        if (i==1) {
           return new ConcreteClass1();
        } else if (i==2) {
           return new ConcreteClass2();
        }
     }
}

3) Когда вы контролируете или иным образом отслеживаете количество экземпляров класса. Синглтон является наиболее часто используемым примером этого.

4) При объявлении констант.

5) Операции, такие как сортировки или сравнения, которые работают с несколькими объектами класса и не привязаны к какому-либо конкретному экземпляру.

6) Когда требуется специальная обработка перед первым созданием объекта.

0 голосов
/ 03 апреля 2018

Используйте статический метод, если метод не принадлежит конкретному объекту.

Например, если вы посмотрите на класс Math в .NET Framework, вы увидите что все методы являются статическими. Зачем? Потому что нет причин для создания объект для использования методов. Почему вы хотите создать объект Math класс, когда все, что вы хотите, это абсолютная стоимость чего-либо? Не здесь нет причин делать это, и поэтому метод является статическим.

Итак, когда вы разрабатываете класс, спросите себя:

Этот метод принадлежит объекту или самому классу?

Метод принадлежит объекту, если он изменяет состояние объекта. Если метод не изменяет конкретный объект, он, скорее всего, может быть статическим.

Другой пример, предположим, что вы хотите знать, сколько объектов класса что создано (не спрашивайте меня, почему ...). Для этой задачи вы можете создать статический метод GetNumberOfObjects() (и вам, очевидно, нужно статическое поле, и некоторый код в конструкторе тоже). Зачем мне это статично, вы могли бы просить. Ну, ответь на поставленный выше вопрос, и ты увидишь. Метод не принадлежат к какому-то конкретному объекту. Кроме того, он не изменяет никаких объектов.

Надеюсь, это имеет смысл.

0 голосов
/ 15 октября 2008

Вы можете использовать статические методы, когда у клиента класса нет экземпляра класса для работы с ним. Например, шаблон проектирования Singleton используется для обеспечения того, чтобы в системе существовал только один экземпляр класса. Требуется, чтобы конструкторы Singleton были частными, чтобы клиент не мог создавать экземпляры.

Итак, если вы не можете создать экземпляр, как вы получаете доступ к методам экземпляра класса? Вызывая статический метод, который возвращает экземпляр класса Singleton.

Это, конечно, только один сценарий, но есть много других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...