2016-06-17 67 views
6

Ho scoperto che le classi con metodo di default uguale ha diverse istanze di metodo meta oggetto . Perché è così? A prima vista non sembra ottimale perché gli oggetti metodo sono immutabili.Perché più istanze dell'oggetto Method sono per i metodi ereditati

+0

Non penso ci sia alcuna ragione teorica, probabilmente non è solo un'ottimizzazione che porterebbe un notevole miglioramento nella pratica per il suo prezzo. – biziclop

+0

Provare a convertire entrambi in stringa, se appartengono a classi diverse, la loro rappresentazione di stringa dovrebbe essere diversa. –

+0

Che cosa ha a che fare gli oggetti Method immutabili perché non è ottimale? – EJP

risposta

5

Sfortunatamente, gli oggetti Method sono non immutabili. Poiché Java 2, Method estende AccessibleObject, che ha il metodo setAccessible(boolean).

Quindi, non solo i metodi hanno una proprietà mutabile, questo flag ha impatti sulla sicurezza che non consentono la condivisione degli oggetti Method.

Nota che sotto il cofano, Method oggetti condividono il loro stato immutabile comune tramite un oggetto delegato, quindi quello che si ottiene da Class.getMethod è solo un oggetto di front-end a basso costo che consiste di quella bandiera mutevole e un riferimento al metodo canonica condiviso rappresentazione.

0

Uguale metodo di oggetto non è finale, avrebbe dovuto essere reimplementato dalla classe X

+2

Questo in realtà non risponde alla domanda. – biziclop

+0

cosa intendi? Chiede perché il loro è un metodo di differenza tra due uguali. Dico che la classe X avrebbe dovuto reimplementare gli uguali. Dice che non è possibile perché tutti i metodi di Object sono immutabili. Dico che non è vero, e perché gli uguali non hanno l'indicatore finale. – sab

+2

Chiede perché ci sono due diversi oggetti 'Metodo' per due classi dove ci sono * non * due diversi metodi' equals() '. E lui ** non ** dice che tutti i metodi di 'Object' sono immutabili. Leggi la domanda. – EJP

2

Il codice seguente stampa false anche per due Method oggetti che si riferiscono alla stessoMethod nella stessa classe:

Method m1 = A.class.getMethod("equals", Object.class); 
Method m2 = A.class.getMethod("equals", Object.class); 
System.out.println(m1 == m2); 

È quindi inattiva durante comportamento singoletto per Method oggetti concernenti il ​​metodo in due diverse classi.