2012-09-18 14 views
6

Estoy haciendo una aplicación basada en swing donde utilizo JTable. Usé DefaultCellEditor para una de las columnas que requiere la selección del cuadro combinado. Pero DefaultCellEditor tiene muchos métodos que no necesito. Así que escribí un CellEditor personalizado extendiendo AbstractCellEditor donde implementé solo los métodos requeridos. Mi pregunta es¿El tamaño de una clase java afectará el rendimiento de la aplicación?

(en general) si tenemos una clase y si no necesitamos todos los métodos de esa clase, está bien usarla o es bueno escribir una clase personalizada donde implementamos solo esos métodos que requerimos? y

mediante el uso de una clase personalizada ¿se mejorará el rendimiento (memoria) de la aplicación o se mantendrá igual que la clase que tiene todos los métodos?

Cualquier ayuda será apreciada.

+6

"optimización prematura es la raíz de todo mal" –

+0

@guido "la optimización prematura es la raíz de todo mal" me encantó ...:) – Amarnath

+2

Mathias, ¿estás diciendo que la JVM no carga todos los métodos de una clase, solo los que realmente se llaman? Tienes una referencia para eso? – Faelkle

Respuesta

15

A menos que tengas buenas razones para creer que nada más en la aplicación, incluido el propio JDK usa DefaultCellEditor,, casi con seguridad estás perdiendo el tiempo empeorando las cosas.

También debe tener en cuenta que puede haber guardado quizás 100k de código en casos extremos, donde el JVMS típico usa alrededor de un gigabyte para ejecutar. Entonces puede haber guardado el 0.01% del espacio del código. Este no es un uso productivo de tu tiempo. El procedimiento correcto es probar y medir dónde están realmente los cuellos de botella de tiempo y espacio, después del hecho. Los programadores son notoriamente pobres a la hora de predecir estas cosas.

+0

+1. Use 'DefaultCellEditor' porque sabe que va a funcionar y no habrá introducido ningún error. Una vez que haya terminado, perfile el sistema y si el 'DefaultCellEditor' aparece como un punto de acceso, _then_ considere la posibilidad de personalizarlo o reescribirlo. Optimice el último, cuando comprende completamente el espacio problemático y tiene una solución funcional. – Faelkle

3

El código (el bytecode real) para esta clase solo se carga una vez, en la región PermGen de la memoria, independientemente de cuántos objetos de este tipo crea.

No aceptaría este código ya que está duplicando la funcionalidad que ya está disponible, y no está agregando funcionalidad a AbstractCellEditor, está reimplementando el código en DefaultCellEditor que ya ha sido (con suerte) probado por Oracle (o Sun)

Como dijo EJP, no vale la pena el tiempo y el potencial para introducir errores.

1

Si crea una clase personalizada que contiene menos objetos miembro, la huella de memoria será menor. La cantidad de métodos no afectaría el tamaño de los objetos, solo el tamaño de la clase.

En general, no optimizaría prematuramente a menos que determine que realmente tiene un problema (es decir, si tiene miles de instancias del objeto y el análisis de registro de colector de basura/montón revela que está agotando la memoria y/o tienen frecuente de colecciones del antiguo espacio), ya que el código adicional significa:

  • mantenimiento adicional (lo que se necesita para asegurar que su encargo CellEditor no está libre de errores)
  • esfuerzo adicional por escrito el código personalizado
  • Esfuerzo adicional para probar el código personalizado

AFAIK, un CellEditor se crea una instancia cuando sea necesario, por lo que no se ahorraría mucha memoria de todos modos.

+0

Su primera oración solo es verdadera si nadie más usa la clase reemplazada, en este caso 'DefaultCellEditor', y no responde a la pregunta, que trata sobre métodos, no sobre 'objetos miembros'. – EJP

+0

Es cierto, pero ese tipo de cosas es difícil de medir debido a las referencias difíciles a los objetos de _otros_ objetos. Si transfiere algo a un constructor al que ya se hace referencia en otro lugar en el gráfico de objetos, la huella superficial puede aumentar, pero la memoria total utilizada no lo hace. – Faelkle

Cuestiones relacionadas