2010-09-01 17 views
7

Acaba de empezar a usar Java. Encuentro muchas similitudes con .NET, pero veo que todos los métodos en Java son virtuales por defecto. Entonces, la pregunta es: ¿qué puedo hacer para que no sean virtuales? ¿Es la palabra clave final la solución correcta?Métodos no virtuales en Java

+0

http://download.oracle.com/javase/tutorial/java/IandI/final.html –

+5

Adivina qué, encontré en 'C# .NET' muchas similitudes con' JAVA' ... como tengo algunas similitudes con mi padre ... –

+5

@Garis No entiendo tu punto ... ¿Cómo está conectado a la pregunta? – NixDev

Respuesta

8

Sí, o privada

+5

Pero 'privado' - al igual que en .net - hace que el método no esté disponible para otras clases para llamar, así como para evitar la anulación. –

+2

Pero, ¿qué puedo hacer cuando necesito tener un método en la clase infantil con el mismo nombre que en la clase principal? En C# hay una palabra clave nueva para tales casos ... ¿hay algo similar en Java? – NixDev

+1

no, nada en absoluto –

2

En lugar de definir todos los métodos como finales, también se puede definir como toda la clase final. No estoy diciendo si este estilo es bueno o malo.

6

Si intenta hacer que el método no sea virtual para el rendimiento, permita que el JIT lo solucione hasta que tenga evidencia de que no está funcionando.

Si la razón para hacer que el método no sea virtual es poder definirlo en una subclase pero no involucrar polimorfismo, probablemente estés creando una subclase sin motivo real (publica más código si quieres impugnar este)

Si es por diseño, sugeriría hacer la clase final en lugar de métodos individuales si es posible. IDEA tiene buenas inspecciones para el diseño de clase. Trata de no escuchar demasiado de cerca a aquellos que quieren que dejes todo abierto para que puedan subclase para hackear errores o limitaciones; te gritarán aún más fuerte cuando accidentalmente rompas su subclase.

Proporcione a los clientes la posibilidad de agregar sus propios tipos en lugar de la subclase suya y probablemente ni siquiera noten que sus clases son definitivas.

1

Hazlo estático.

Si llama a un método no virtual, quiere saber desde su código a qué método de clase está llamando. El defecto de .net es que no puedes saberlo desde tu código.

Ejemplo

En Java si se define como ClassB

public class ClassB extends ClassA { 
    @Override 
    public void run() { 
    } 
} 

y el objeto

ClassA obj=new ClassB(); 

Si llama obj.run() ¿cómo saber si ese código es siguiendo las reglas del principio polimórfico de apertura/cierre o codificará el método relacionado con la Clase A? En Java sabrás que siempre hay polimorfismo. Es más fácil hacer burlas y es más fácil extender las clases y seguir el principio de sustitución de Liskov.

En los métodos estáticos otro lado están limitadas a una clase así que si quieres llamar a un método que se relaciona con claseA se puede definir que método como este:

public static run(ClassA obj) 

y se le puede llamar con

ClassB obj=new ClassB(); 
ClassA.run(obj); 

y desde el código sabrá que el método que está llamando se define en ClassA y no en ClassB.

+2

No. No hagas un método estático cuando pertenece al objeto. Eso es realmente un mal diseño. – Cephalopod

Cuestiones relacionadas