2010-09-01 19 views
7

Appena iniziato a utilizzare Java. Trovo molte somiglianze con .NET, ma vedo che tutti i metodi in Java sono virtuali di default. Quindi la domanda è: cosa posso fare per renderli non virtuali? La parola chiave final è la soluzione giusta e giusta?Metodi non virtuali in Java

+0

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

+5

Indovina cosa, ho trovato in 'C# .NET' un sacco di somiglianze con' JAVA' ... come ho alcune somiglianze con mio padre ... –

+5

@Garis Non riesci a ottenere il tuo punto ... Come è collegato alla domanda? – NixDev

risposta

8

Sì, o privato

+5

Ma 'private' - proprio come in .net - rende il metodo non disponibile per le altre classi da chiamare, oltre a impedire l'override. –

+2

Ma cosa posso fare quando ho bisogno di avere un metodo in classe figlio con lo stesso nome che è nella classe genitore. In C# c'è una parola chiave nuova per questi casi ... c'è qualcosa di simile in Java. – NixDev

+1

no, niente del tutto –

2

Invece di definire tutti i metodi come finale, è anche possibile definire l'intera classe come definitiva. Non sto dicendo se questo stile buono o cattivo.

6

Se si mira a rendere il metodo non virtuale per le prestazioni, lasciare che la JIT gestisca tale problema finché non si ha la prova che non lo sta facendo.

Se il motivo per rendere il metodo non-virtuale è poterlo definire in una sottoclasse ma non coinvolge il polimorfismo, probabilmente stai creando sottoclassi senza un vero motivo (inserisci più codice se vuoi contestare questo).

Se è per il design, suggerirei di fare la finale di classe invece dei singoli metodi se possibile. IDEA ha buone ispezioni per il design della classe. Cerca di non ascoltare troppo da vicino chi vuole che tu lasci tutto aperto in modo che possano sottoclasse per incappare in bug o limitazioni; ti urlano ancora più forte quando rompi accidentalmente la loro sottoclasse.

Fornire un modo per i clienti di aggiungere i propri tipi anziché la propria sottoclasse e probabilmente non si accorgeranno nemmeno che le classi sono definitive.

1

Rendilo statico.

Se si chiama un metodo non virtuale, si desidera sapere dal proprio codice quale metodo di classe si sta chiamando. Il difetto di .net è che non puoi saperlo dal tuo codice.

Esempio

In Java se si definisce come ClassB

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

ed oggetto

ClassA obj=new ClassB(); 

Se si chiama obj.run() come si può sapere se il codice è seguendo le regole del principio polimorfico di apertura/chiusura o codificherà il metodo relativo a ClassA? In Java saprai che c'è sempre il polimorfismo. È più facile creare mock ed è più facile estendere le classi e seguire il principio di sostituzione di Liskov.

Sui metodi statici invece sono delimitate a una classe così se si desidera chiamare un metodo che è legato al ClasseA è possibile definire che metodo come questo:

public static run(ClassA obj) 

e si può chiamare con

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

e dal codice si saprà che il metodo che si sta chiamando è definito in ClasseA e non in ClasseB.

+2

No. Non rendere statico un metodo quando appartiene all'oggetto. Questo è davvero pessimo design. – Cephalopod

Problemi correlati