Должен ли класс когда-либо иметь статические и нестатические члены - PullRequest
3 голосов
/ 30 января 2010

Я пытаюсь выяснить, когда для класса было бы целесообразно иметь как статические, так и нестатические функции. AKA:

$obj = new ClassA;
$obj->doOOPStuff();

$something = ClassA::doStaticStuff();

Примечание. Этот пример сделан на PHP, однако вопрос не зависит от языка.

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

Существуют ли какие-либо жизнеспособные случаи, когда у меня был бы класс, в котором использовались бы статические и нестатические члены?

Ответы [ 10 ]

7 голосов
/ 30 января 2010

Один пример: когда Творение должно происходить определенным образом.

class Foo {
public:
  static Foo* Create(...params...);

private:
  Foo();
};
5 голосов
/ 30 января 2010

Рассмотрим String класс в .NET. Он содержит нестатический метод Split, который разбивает некоторый экземпляр на string[], и статический метод Join, который принимает string[] и снова преобразует его в строку.

Статический метод применим, когда вам не нужно сохранять какое-либо состояние. Таким образом, Math.Sin() зависит только от его параметров, и при одинаковых параметрах вывод всегда будет одинаковым. Нестатический метод может иметь различное поведение, вызывается несколько раз, поскольку он может сохранять внутреннее состояние.

3 голосов
/ 30 января 2010

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

2 голосов
/ 30 января 2010
  • Чаще всего статический метод заводские методы

    public class MyClass {    
        public static MyClass createMyClass(int a, double b) {..}
        public static MyClass createSubclassOfMyClass(int c, boolean cond) {..}
        public int calculateThis();
        public double calculateThat();
    }
    
  • Другое использование - это доступ к некоторому свойству, которое логически связано с этим классом, но не отдельно от экземпляров. Например - кеш:

(Примечание. Конечно, в этом примере необходимо учитывать синхронизацию)

public class MyClass {
    public static final Cache cache = new Cache();
    public static void putInCacheIfNeeded(Object obj) {..}
    public static void replaceInCache(Object obj) {..}

    public void doSomethingCacheDependend(Object obj) {
        if (something) {
             MyClass.putInCacheIfNeeded(obj);
        } else {
             MyClass.replaceInCache(obj);
        }
    }
}

(язык Java для примеров)

1 голос
/ 30 января 2010

Статическая функция может предоставить конструктору значимое имя.

$dialog = DialogFoo::createOpenDialog();
$dialog = DialogFoo::createDocumentOpenDialog();
$dialog = DialogFoo::createImageOpenDialog();

Может также использоваться для принудительного применения шаблона Singleton .

$dialog = DialogFoo::getInstance()
1 голос
/ 30 января 2010

Представьте, что ваш конструктор имеет две перегрузки, которые являются строками:

public class XmlDocument
{
    public static XmlDocument CreateFromFile(string filePath);
    public static XmlDocument CreateFromXml(string xml);
}
0 голосов
/ 30 января 2010

Как правило, статические функции создают функциональность, тесно связанную с самим классом. Это могут быть некоторые вспомогательные функции, заводские методы и т. Д. В этом случае все функции содержатся в одном месте, они соответствуют принципу DRY , увеличивают сцепление и уменьшают сцепление .

0 голосов
/ 30 января 2010

Давайте предположим, что у класса есть методы экземпляра, вот несколько хороших примеров использования статических методов:

Для статических служебных методов

Такие методы применяются к любому экземпляру, например, String.format(String, Object...) в Java.

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

Для статических заводских методов

Методы фабрики - это методы, которые просто создают экземпляры таких объектов, как getInstance() и valueOf() методы в API Java. getInstance() - это обычный метод создания экземпляров в синглетонах, тогда как valueOf() часто являются методами преобразования типов, как в String.valueOf(int).

Используйте их для повышения производительности с помощью объектного кэширования в основанных на интерфейсе средах (например, Collections Framework в Java), где вы можете захотеть вернуть подтип для реализации синглетонов (кашель).

0 голосов
/ 30 января 2010

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

class foo {
private:
static int count;
foo() {}

public:
static foo bar() {
count++;
if (count<=10){
return new foo;
} else {
return null;
}
0 голосов
/ 30 января 2010

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

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