Подтвердить что ты не робот

Когда следует писать статические методы?

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

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

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

Что касается статических полей, то лучше всего их использовать?

4b9b3361

Ответ 1

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

EDIT: от stevemegson в комментариях

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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

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

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

Ответ 7

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

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

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

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

Итак, вы должны добавить "статический" к любым методам, которые вы можете использовать.