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

Разница между классом singleton и статическим классом?

Возможные дубликаты:
Разница между статическим классом и одноэлементным шаблоном?
В чем разница между шаблоном Singleton и статическим классом в Java?

HI Я явно не понимаю. Какая разница между классом singleton и статическим классом? Может ли кто-нибудь описать это на примере?

4b9b3361

Ответ 1

Старый que/ans on SO: Разница между статическим классом и одноэлементным шаблоном?

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

Синглтон, с другой стороны, является шаблоном, специфичным для дизайна OO. Это экземпляр объекта (со всеми возможностями, присущими этому, например, полиморфизм), с процедурой создания, которая гарантирует, что на протяжении всего жизненного цикла есть только один экземпляр этой конкретной роли.

Ответ 2

Singleton Class: Singleton Класс - это класс, из которого может существовать только один экземпляр для каждого загрузчика классов.

Статический/вспомогательный класс (класс с только статическими полями/методами): экземпляр этого класса не существует. Только поля и методы могут быть напрямую доступны как константы или вспомогательные методы.

Ниже приводится ссылка на этот блог " Статические классы в Java" . В блоге также есть примеры для объяснения того же:

Пример Singleton:

public class ClassicSingleton {
    private static ClassicSingleton instance = null;

    private ClassicSingleton() {
        // Exists only to defeat instantiation.
    }

    public static ClassicSingleton getInstance() {
        if (instance == null) {
            instance = new ClassicSingleton();
        }
        return instance;
    }
}

Пример статического класса:

/**
 * A helper class with useful static utility functions.
 */
public final class ActionHelper {

    /**
     * private constructor to stop people instantiating it.
     */
    private ActionHelper() {
        // this is never run
    }

    /**
     * prints hello world and then the users name
     * 
     * @param users
     *            name
     */
    public static void printHelloWorld(final String name) {
        System.out.println("Hello World its " + name);
    }

}

Итак, какая разница между двумя примерами и почему я думаю, что второе решение лучше для класса, который вы не хотите или должны создавать. Во-первых, шаблон Singleton очень полезен, если вы хотите создать один экземпляр класса. Для моего вспомогательного класса мы действительно не хотим создавать экземпляр какой-либо копии класса. Причина, почему вы не должны использовать класс Singleton, заключается в том, что для этого вспомогательного класса мы не используем никаких переменных. Класс singleton был бы полезен, если бы он содержал набор переменных, которые мы хотели использовать только один набор, а методы использовали эти переменные, но в нашем вспомогательном классе мы не использовали никаких переменных, кроме тех, которые были переданы (что мы делаем окончательным), По этой причине я не считаю, что нам нужен экземпляр singleton, потому что мы не хотим каких-либо переменных, и мы не хотим, чтобы кто-то инстанцировал этот класс. Поэтому, если вы не хотите, чтобы кто-то создавал экземпляр класса, что обычно, если у вас есть какой-то класс helper/utils, я использую то, что я называю статическим классом, класс с частным конструктором и состоит только из статических методов без каких-либо любые переменные.

Тот же ответ также ссылается на мой ответ здесь

Ответ 3

Разница не в правильном способе спросить. Потому что singleton не является ключевым словом по сравнению со статическими. вы должны спросить: "Когда выбрать какой?". каковы преимущества одиночного класса над статическим классом, эти вопросы приходят на стадии проектирования.

Singleton: Применение: классы, которые служат глобальной конфигурацией, например: пробная версия программного обеспечения с одним подключением к базе данных, экземпляры классов JDK Runtime на jvm.

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

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

Когда идти: 1. вспомогательные классы, используемые всеми классами в вашем развитии api.

недостаток: 1. С нетерпением загружаются классы.

ожидание очков от других людей.

Ответ 4

Это разница между шаблоном и тем, как реализуется шаблон.

Шаблон Singleton не привязан специально к языку Java. Могут быть разные способы сделать класс в одноэлементном, в зависимости от используемого вами языка. Многие языки OO используют эквивалент статических переменных для создания сингла, но другие могут использовать разные методы.

Кроме того, некоторые способы реализации singleton лучше других. Одним из хороших способов реализации Singleton является правильная инкапсуляция доступа к этому Singleton с помощью метода factory:

public class Example {
    private static final Example SINGLETON = new Example();

    public Example getInstance() { return SINGLETON; }

    private Example() { /* Constructor */ }
}

Используя эту технику, вы можете делать всевозможные сложные вещи: lazy-load singleton, заменить его на некоторый подкласс, управлять инициализацией синглтонов через конфигурацию и т.д.

Ответ 5

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

A static class всегда является классом-членом, который, в отличие от внутреннего класса, не имеет доступа к переменным экземпляра окружающего класса.


Пример статического класса

public class A {
  public static class B {        
  }     
  public        int notAccessibleForB;
  public static int    accessibleForB;
}

Шаблон Singleton (простой старый стиль)

public final class Singleton {
  public final static Singleton INSTANCE = new Singleton();
  private Singleton(){}
}

Шаблон Singleton (простой современный стиль)

public enum Singleton {
   INSTANCE;
}