2012-09-21 21 views
10

¿Cuál es el enfoque correcto para una clase de utilidad que tiene todos los métodos con estática pública?
¿Debo usar la clase final o clase abstracta?
Por favor, dar sugerencia.
Como por ejemplo:
Clase de utilidad: ¿Cuál es el enfoque correcto?

public final class A{ 
    public static void method(){ 
     /* ... */ 
    } 
} 

O

public abstract class A{ 
    public static void method(){ 
     /* ... */ 
    } 
} 

Respuesta

7

abstract tiene su propio fin. Si desea alguna funcionalidad de clase implementada por otras clases (override), entonces usa abstract.

Si solo es la clase de utilidad, pero no desea que otras clases lo subclases, entonces iría con la clase final. Si la clase de utilidad tiene solo static métodos, de cualquier manera no puede anularlos, por lo que no hace la diferencia tenerlos también en la clase non-final.

+0

ok. Gracias. Entonces debería usar la clase final. –

+5

También debe agregar un constructor privado, no-args, para que ningún otro código intente instigar la clase. –

+0

gracias, eso evitará la creación del objeto ... –

1

si quieres otras clases para utilizar la funcionalidad de esta clase, entonces hacen abstracta otra cosa que sea final

4

final aquí hace más sentido que abstract. Al marcar la clase como final, prohíbe extender la clase. Por otro lado, marcar la clase como abstract es todo lo contrario, porque la clase abstracta sin subclases no tiene mucho sentido. Por lo tanto, se espera que se extienda.

+0

no ..por abstracto quiero evitar la creación de objetos. –

+0

Sí, eso es cierto, pero no diría que es el objetivo principal. Si se crea una clase abstracta, se espera que sea extendida por otra clase o instanciada como clase anónima con todo el método abstracto anulado. –

+0

ok jiri ......... –

2

Haz que la clase sea definitiva y agrega un constructor privado. (Esto es lo que las clases como java.lang.Math uso)

public final class A { 
    private A() {} 

    public static void method() { 
    } 
} 
+0

Gracias por la opinión. –

6

mejor enfoque para la creación de clases de servicios públicos. Si no quieres que otras clases lo hereden.

//final, because it's not supposed to be subclassed 
public final class AlertUtils 
{ 

// private constructor to avoid unnecessary instantiation of the class 
    private AlertUtils() { 
    } 

    public static ..(){}//other methods 
} 
+0

Gracias por la sugerencia –

0

Estas son algunas pautas que he encontrado:

  • Todos los métodos deben ser públicas estática, por lo que no se pueden anular.
  • El constructor debe ser privado, por lo que evitará la creación de instancias.
  • La palabra clave final para la clase evita la subclasificación.
  • La clase no debe tener ningún campo de clase no final o no estático.

Como ya has pedido, el nombre de la clase no puede ser abstracto (no recomendable) -> Lo que significa que estás planeando implementarlo en otra clase. Si quiere evitar la subclasificación, use la final para el nombre de la clase; Si desea evitar la creación de instancias, use un constructor privado.

Cuestiones relacionadas