2017-11-20 2 views
-3

Ich habe eine Frage in effective_java dieses Buch, was der mittleren ist ‚moderne Java Virtual Machine (JVM) Implementierungen sind fast sicher, den Aufruf der statischen Factory-Methode Inline.‘ Ich verstehe nicht, ‚den Aufruf der statischen Factory-Methode inline‘über inline den Anruf von effective_java Buch

Zitat:

Der Hauptvorteil des Ansatzes öffentlichen Bereich ist, dass die Erklärungen machen deutlich, dass die Klasse ein Singleton : das öffentliche statische Feld ist endgültig, so dass es immer das gleiche Objekt Referenz enthalten wird. Es ist nicht mehr jeder Leistungsvorteil für die Öffentlichkeit Feld Ansatz: moderne Java Virtual Machine (JVM) Implementierungen sind fast sicher den Aufruf der statischen Factory-Methode

+1

Es würde wirklich helfen, ein bisschen mehr Kontext zu haben. Es ist mehrdeutig, ob der Autor über die Kompilierung von Bytecode, JIT-Kompilierung von Bytecode oder bestimmte Bytecodeoptimierungen spricht, die VMs während der Interpretation vornehmen können. – lockcmpxchg8b

+1

Wenn Sie aus einem Buch zitieren - geben Sie bitte bei Bedarf das vollständige Zitat und den zusätzlichen Kontext an. – alfasin

+0

Dies ist ein bisschen abseits von Thema, aber das Buch ist für erfahrene Java-Programmierer –

Antwort

0

Die „öffentlichen Bereich Ansatz“ Inline ist (angenommen aus dem Buch "Effective Java" By Josh Bloch):

// Singleton with public final field 
public class Elvis { 
    public static final Elvis Elvis = new Elvis(); 
    private Elvis() { ... } 

    public void leaveTheBuilding() { ... } 
} 

Während der Annäherung an Sie die statische Fabrik in dem Zitat sich beziehen ist:

// Singleton with static factory 
public class Elvis { 
    private static final Elvis INSTANCE = new Elvis(); 
    private Elvis() { ... } 
    public static Elvis getInstance() { return INSTANCE; } 

    public void leaveTheBuilding() { ... } 
} 

Und das Zitat, das Sie erwähnten, erklärt, dass die "Leistungseinbuße" für den statischen Fabrikansatz (weil wir eine Methode getInstance aufrufen, statt das Feld direkt zu verwenden: Elvis.INSTANCE) nicht mehr existieren (oder, sehr geringe Chance, dass es tut) Da der Compiler intelligent genug ist, den Aufruf in den kompilierten Bytecode einzubinden, ist die Leistung beider Ansätze ähnlich, während der zweite Ansatz besser ist, da er eine Kapselung bereitstellt.

+1

oh, ich scheine zu verstehen, danke – sunh