2016-11-28 5 views
1

может кто-нибудь объяснить мне ясно на java singleton design pattern class vs java final class. мы можем использовать конечный класс вместо одного класса singleton, для конечного класса мы можем создать экземпляр класса и использовать в нем методы, но не переопределяющие свойства, если эти методы являются статичными в конечном классе, мы можем просто вызвать такие методы, как ClassName .getMethod, почему мы идем для singleton вместо конечного класса.java singleton class vs final class

+1

Вы не можете продлить окончательный класс, но можете расширить одноэлементный класс. –

+1

Эти два понятия полностью ортогональны. – yshavit

+0

Поскольку статические переменные не могут быть перезаписаны даже подклассами, вопрос в основном сводится к: зачем использовать одноэлемент вместо статических переменных класса !? – luk2302

ответ

6

Последний класс - это тот, который нельзя продлить. Вы можете иметь любое количество экземпляров в конечном классе. Лучший пример последнего класса - String. Singleton - это единственный экземпляр класса. Таким образом, оба они не совсем одинаковы, однако вы можете сделать свой финальный класс singleton ограниченным, чтобы кто-то его расширил.

+0

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

1

Singleton - это класс с одним экземпляром на всю жизнь вашей программы. Но последний класс, вы можете иметь несколько экземпляров. Дело в том, что вы не можете наследовать от конечного класса, но ничто не мешает вам иметь множество экземпляров.

2

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

i.e, final class - неизменяемый класс, может создавать несколько экземпляров, но в том случае, когда класс Singleton имеет только один экземпляр.

0

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

Обратите внимание, что, когда я говорю за JVM Я говорю о том, к примеру, .class файл в .war файл развернут один раз; если одно и то же веб-приложение развернуто несколько раз, каждый получает свой собственный singleton.

-1

Я думаю, что ваш вопрос больше о статическом и синглетоне. Будучи окончательным классом, в данном контексте не имеет значения, поскольку вы не можете переопределить статический метод (вы можете, конечно, определить один и тот же статический метод подписи в расширении, но это было бы неуместно, потому что ставка будет по-прежнему «статичной» в том смысле, что вызов SuperClass.getMethod всегда будет вызывать определение из SuperClass). Это классический вопрос, и я уверен, что вы можете найти ответ в другом месте. Однако, чтобы дать вам короткий ответ, я бы сказал, что использование singleton позволяет вам реализовывать интерфейсы и передавать ваш объект singleton, как любой другой объект.

Возможно, я могу объяснить, кому я дал -1, что я имел в виду (я думал, что это достаточно ясно). Оригинальный вопрос - о одиночном и финальном. Но когда он объясняет, он ясно заявляет, что собирается использовать статические методы. Он не понимает тогда, что то, что делает методы уникальными в том смысле, что они принадлежат к одному классу, является тем фактом, что они являются статическими, а также методы класса вместо методов экземпляра. Быть окончательным не имеет никакого эффекта: пользователь может создавать экземпляры столько, сколько он хочет, это только мешает ему продлить класс, что, похоже, не является истинной заботой о том, кто задал вопрос. С другой стороны, он ясно заявляет, что будет использовать статические методы в своем последнем классе. Кажется, это указывает на то, что он хочет сделать его синглом с помощью статических методов: это классический способ сделать это, и вопрос об использовании статических методов против singleton был задан раньше.См. Например, Why use a singleton instead of static methods? или Difference between static class and singleton pattern? Когда я пишу об переопределении статического метода, я пытаюсь объяснить, что статический метод на самом деле не переопределен в том смысле, что они не участвуют в динамической привязке. Например, если у вас есть класс A со статическим методом foo(), а затем класс B расширяет класс A и переопределяет статический foo(), это нормально. Но вызов foo() для объекта obj вызовет статический метод, принадлежащий типу obj, даже если вы назначили ему другой объект во время выполнения (это то, что я называю статическим связыванием). Другими словами, если вы объявляете «A obj = new B()» и вызываете obj.foo(), он все равно вызовет A.foo() . Я не знаю, помогает ли это объяснение, я желаю, чтобы кто-нибудь дал мне -1 объяснил почему.