2010-06-02 18 views
12

¿Por qué es una buena práctica marcar una clase con solo constructores privados como final? Mi suposición es que es para que otros programadores sepan que no puede ser subclasificado.constructor privado y final

+0

método -> constructor? ¿No te refieres a una clase? –

+0

s/method/class /? (: – hudolejev

+0

marcando una clase como final, ¿quieres decir? – lindelof

Respuesta

5

Hacer una final de clase tiene algo de ganancia de rendimiento (pequeña), porque el compilador JIT puede alinear la funcionalidad de esa clase. No sé si eso califica como 'buena práctica', pero veo las ventajas.

+1

¿No ve el compilador JIT de todos modos si esa clase tiene subclases concretas cargadas y si se anula un método? Imagino que puede alinearse de todos modos en tal caso, independientemente de si la clase/método es declarado 'final' . Por otra parte, no soy un experto en JIT, solo curiosidad :-) –

+6

HotSpot determina si la clase tiene una subclase cargada. No importa si la clase está marcada como "final" o no. –

+0

@Tom, gracias, esto confirma mi sensación :-) –

4

Quieres decir "una clase con constructor privado" ¿o sí?

Una clase final no se puede subclasificar. Esto puede representar una decisión de diseño. No todas las clases están diseñadas para ser subclasificadas, por lo tanto, si la tuya no lo es, es mejor marcarla explícitamente para evitar errores sutiles más adelante.

Una clase con constructores privados solo no puede ser instanciada por el mundo exterior (ni subclasificada). Esto puede ser útil, por ej. singletons, o clases donde desea controlar qué instancias de la clase se crean. P.ej. antes de Java5, el patrón typesafe enum lo usaba.

+0

Sí, lo vi justo ahora. Lo siento. Eliminé el voto negativo. – Hardcoded

+0

@Hardcoded, no hay problema :-) –

12

A menudo se considera (por ejemplo, por Josh Bloch y los diseñadores de C#) una buena práctica marcar todo como final a menos que tenga una razón explícita para no hacerlo. Suponiendo que te refieres a la clase, tienes razón en que una clase con solo constructores privados no puede ser subclasificada. Por lo tanto, la final podría considerarse redundante, pero como dices tiene valor para la documentación. Como Marc sugiere, también puede ayudar a la optimización.

+0

"A menudo considerado" por quién? [citación necesitada] –

+1

marca todo como final? Creo que te refieres a variables y parámetros. Pero no es una buena idea marcar todas las clases y métodos como definitivos. Esto limitaría la extensibilidad de su aplicación daramtically. – Hardcoded

+4

@Hardcoded, escribió "marque todo como final ** a menos que tenga una razón explícita para no **". Es decir. solo permite que la extensión de las clases _designed sea extensible_. –

2

Marcamos la clase como clase final haciendo que el constructor sea privado, para evitar la subclasificación.

Esta es una buena práctica, en los casos en que no queremos que las personas anulen nuestros métodos de clase y cambien la funcionalidad o agreguen las funciones a nuestra clase.

Por ejemplo, las clases String y Math son clases finales, que no podemos extender o subclase, esto es para asegurarnos de que nadie cambie su comportamiento.

1

Una clase final con constructor privado:

  • clase no puede tener subclases, no podemos medida clase final.
  • Clase que tiene constructor privado, no podemos crear el objeto de esa clase.

Significa que otros métodos de la clase serán estáticos, por lo que la clase puede acceder a ellos.

Cuestiones relacionadas