¿Por qué necesitamos un constructor privado?

Si una clase tiene un constructor privado, entonces no se puede crear una instancia. Entonces, si no quiero que mi clase sea instanciada y aún la use, entonces puedo hacerla estática.

¿Cuál es el uso de un constructor privado?

También se usa en clase singleton, pero a excepción de eso, ¿hay algún otro uso?

(Nota: El motivo por el que excluyo el caso de Singleton anterior es porque no entiendo por qué necesitamos un singleton cuando hay una clase estática disponible. Puede que no responda esto por mi confusión en la pregunta).

Fábrica

Los constructores privados pueden ser útiles cuando se usa un patrón de fábrica (en otras palabras, una función estática que se usa para obtener una instancia de la clase en lugar de una instanciación explícita).

public class MyClass { private static Dictionary cache = new Dictionary(); private MyClass() { } public static MyClass GetInstance(object data) { MyClass output; if(!cache.TryGetValue(data, out output)) cache.Add(data, output = new MyClass()); return output; } } 

Pseudo sellado con niños nesteds

Cualquier clase anidada que herede de la clase externa puede acceder al constructor privado.

Por ejemplo, puede usar esto para crear una clase abstracta de la que pueda heredar, pero nadie más (un constructor internal también funcionaría aquí para restringir la herencia a un único ensamblaje, pero el constructor private obliga a todas las implementaciones a ser clases anidadas. )

 public abstract class BaseClass { private BaseClass() { } public class SubClass1 : BaseClass { public SubClass1() : base() { } } public class SubClass2 : BaseClass { public SubClass2() : base() { } } } 

Constructor de base

También se pueden usar para crear constructores “base” llamados desde diferentes constructores más accesibles.

 public class MyClass { private MyClass(object data1, string data2) { } public MyClass(object data1) : this(data1, null) { } public MyClass(string data2) : this(null, data2) { } public MyClass() : this(null, null) { } } 

Como Stefan, Adam y otros han señalado, los constructores privados son útiles en los casos en que no es deseable que una clase sea creada por código fuera de la clase . Singletons, fábricas, objetos de método estático son ejemplos de donde poder restringir construcciones de un tipo es útil para imponer un patrón particular.

Para responder a la segunda parte de su pregunta sobre por qué son necesarios los singleton si existen clases estáticas: los singleton y las clases estáticas no son equivalentes.

Por ejemplo, una clase singleton puede implementar una interfaz, una clase estática no puede. Un objeto singleton puede pasarse a los métodos como un parámetro; esto no es tan fácil de hacer con las clases estáticas sin recurrir a objetos de envoltura o reflexión. También hay casos en los que es posible que desee crear una jerarquía de herencia en la que una (o más) de las clases de hoja sean únicas, esto tampoco es posible con las clases estáticas. Como otro ejemplo, puede tener varios Singletons diferentes y es posible que desee crear una instancia de uno de ellos en tiempo de ejecución en función de los parámetros ambientales o de configuración; esto tampoco es posible con las clases estáticas.

Es importante comprender las características del idioma y elegir el más adecuado para el trabajo; están ahí por una razón.

A veces no deberías poder instanciar una clase. Esto lo hace explícito e impone esto a nivel de comstackdor.

Singletons son solo un caso de uso. Las clases de constantes, las clases de métodos estáticos y otros tipos de patrones dictan que una clase no debe ser instanciable.

Bueno, si su único objective es que no quiera que se lo instancia, entonces hacerlo estático es suficiente.

Si, otoh, simplemente no quieres que se instale desde fuera de la clase (tal vez solo quieras que los usuarios obtengan uno usando una fábrica estática en la clase), entonces necesitas un ctor privado para permitir el acceso público estático. fábricas para instanciarlo.

Históricamente, recuerde que hacer una clase estática no siempre ha existido … Convertir el ctor en privado era una forma de hacerlo no instanciable (¿es esto una palabra?) Antes de que la palabra clave static se pudiera aplicar a una clase …

Propósito de crear el constructor privado dentro de una clase

  1. Para restringir una clase heredada.

  2. Restrinja una clase al crear instancias o crear múltiples instancias / objetos.

  3. Para lograr el patrón de diseño singleton.

     public class TestPrivateConstructor { private TestPrivateConstructor() { } public static int sum(int a , int b) { return a + b; } } class Program { static void Main(string[] args) { // calling the private constructor using class name directly int result = TestPrivateConstructor.sum(10, 15); // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class } } 

Puede usarlo para forzar una instancia singleton o crear una clase de fábrica .

Un método estático puede llamar al constructor privado para crear una nueva instancia de esa clase.

Por ejemplo, una instancia singleton:

 public class Foo { private Foo (){} private Foo FooInstance {get;set;} public static Foo GetFooInstance () { if(FooInstance == null){ FooInstance = new Foo(); } return FooInstance; } } 

Esto permite que solo se cree una instancia de la clase.

Con respecto a los singletons, Singleton es un patrón de diseño utilizado cuando el entorno y los requisitos satisfacen motivaciones similares para el uso del patrón; las clases estáticas son una característica del lenguaje.

Como se explica en la respuesta de LBushkin , aunque algunos de los objectives del uso de singleton se pueden cumplir utilizando clases estáticas, una implementación particular de singleton puede superar el conjunto de características de clases estáticas solamente.

  • Un uso de constructo privado es cuando tenemos solo miembro estático.
  • Una vez que proporcionamos un constructor que sea privado o público o alguno, el comstackdor no nos permitirá agregar un constructor público sin parámetros a la clase.
  • Si queremos crear un objeto de clase incluso si tenemos constructores privados, entonces necesitamos tener un constructor público junto con un constructor privado

Si la clase SOLO tiene constructores privados, no se puede crear una instancia desde el exterior.

También puede tener constructores privados y constructores públicos con diferentes firmas.

Si desea crear una fábrica para una clase, puede usar una construcción privada y agregar algunos métodos estáticos de “fábrica” ​​a la clase para crear la clase.

Un ejemplo de esto es la clase Graphics , con los métodos From *.