2008-10-14 13 views
12

Así que entiendo qué es un método o campo estático, solo me pregunto cuándo usarlos. Es decir, cuando se escribe código, el diseño se presta a usar métodos y campos estáticos.¿Cuándo debería escribir métodos estáticos?

Un patrón común es usar métodos estáticos como fábrica estática, pero esto podría hacerse fácilmente al sobrecargar un constructor. ¿Correcto? Por ejemplo:

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

En cuanto a los campos estáticos, es la creación de objetos singelton-su mejor uso?

Respuesta

15

Da una mejor idea de la intención cuando se utiliza una fábrica estática, sino que también le permite tener diferentes fábricas que toman los mismos tipos de argumentos pero tienen un significado diferente. Por ejemplo, imagine si Bitmap tenía LoadFromResource (cadena) - no sería posible tener dos constructores que tomaran cadena.

EDITAR: De stevemegson en los comentarios

Una fábrica estática también puede devolver nulo, y puede volver más fácilmente una instancia que recibió de caché. Muchas de mis clases tienen un FromId (int) estático para obtener una instancia de una clave principal, devolviendo una instancia en caché existente si tenemos una.

+0

Una fábrica estática también puede devolver nulo y puede devolver más fácilmente una instancia que obtuvo de la memoria caché. Muchas de mis clases tienen un FromId (int) estático para obtener una instancia de una clave principal, devolviendo una instancia en caché existente si tenemos una. – stevemegson

21

métodos estáticos son generalmente útiles para operaciones que no requieren ningún dato de una instancia de la clase (de this) y puede realizar su finalidad prevista únicamente el uso de sus argumentos.
Un ejemplo simple de esto sería un método Point::distance(Point a, Point b); que calcula la distancia entre dos puntos y no requiere una instancia.

Los campos estáticos son útiles, entre otros, para las constantes que no cambian con frecuencia y que son utilizadas por todas las instancias de una clase.

+0

, entonces, ¿deberíamos crear un método no estático solo cuando queremos acceder a los miembros de datos de esta clase? – JerryGoyal

7

Yo diría que use métodos estáticos siempre que tenga funciones que sean independientes del estado de la instancia, es decir. no depende de ningún campo de instancia.

El estado menos local del que depende un método, es más fácil de entender, por lo que static es una señal útil para el lector del código.

+0

Si entiendo esto correctamente, está diciendo que _alawys_ usa métodos estáticos cuando puede. Pero eso no se siente bien. Hay muchos casos en las bibliotecas de clase base .NET donde los métodos pueden ser estáticos pero no lo son. –

+0

@Chris, eso no significa que lo hicieron bien. – Wedge

+0

@wedge - acepté, estaba depurando algunas de las fuentes de .NET de hoy y me hizo estremecer en algunos lugares, también me sentí mejor acerca del código poco fiable que he escrito también :) – Kev

6

Lo mantengo claro al recordar que los métodos de instancia funcionan en/dentro de objetos individuales mientras que los métodos estáticos hacen algo para la Clase.

En el caso de LoadFromFile(), desea un método estático porque desea una referencia nula si la carga falla, la instancia aún no existe. Si lo implementó como un constructor, tendría que lanzar una excepción en caso de falla.

Otros buenos usos para estáticos: Compare (obj a, obj b), Delete (obj a) para objetos de datos (un objeto no puede eliminarse ya que su referencia está todavía presente), o clases estáticas para código de procedimiento que honestamente no puede ser modelado en un objeto.

0

Puede usar métodos estáticos cuando el cliente de la clase no tenga una instancia de la clase para trabajar. Por ejemplo, el patrón de diseño de Singleton se usa para garantizar que solo exista una instancia de una clase en el sistema. Requiere que los constructores de Singleton sean privados para que el cliente no pueda crear instancias.

Entonces, si no puede crear una instancia, ¿cómo accede a los métodos de instancia de la clase?Llamando a un método estático que devuelve la instancia Singleton de la clase.

Esto es, por supuesto, un escenario, pero hay muchos otros.

0

Éstos son algunos ejemplos de cuándo es posible que desee utilizar los métodos estáticos:

1) Cuando la función no hace uso de ningún variables miembro. No tiene que usar un método estático aquí, pero generalmente ayuda si lo hace.

2) Cuando se utilizan métodos de fábrica para crear objetos. Son especialmente necesarios si no conoce el tipo que se creará de antemano: p.

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

3) Cuando controla, o realiza un seguimiento, el número de instancias de la clase. El Singleton es el ejemplo más usado de esto.

4) Al declarar constantes.

5) Operaciones tales como géneros o comparaciones que operan en múltiples objetos de una clase y no están vinculados a ninguna instancia en particular.

6) Cuando se tiene que hacer un manejo especial antes de la primera instanciación de un objeto.

0

Debe usar métodos estáticos siempre que tenga una función que no dependa de un objeto particular de esa clase.

No hay ningún problema al agregar la palabra clave estática: no se romperá ninguno de los códigos que se refieren a ella. Así, por ejemplo, el siguiente código es válido independientemente de si usted tiene la palabra clave 'estático':

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

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

lo que debería agregar 'estática' a cualquier método a su disposición.