Here is my trick:
SingleTonBillPaugh private, SingleTonBillPaugh$SingleTonHelper , SingleTonBillPaugh$SingleTonHelper, . , : .
, , SingleTonBillPaugh$1? ( SingleTonBillPaugh, SingleTonBillPaugh$1 instance — SingleTonBillPaugh SingleTonBillPaugh$SingleTonHelper).
: , , SingleTonBillPaugh$SingleTonHelper, - . Java , , , .
, SingleTonBillPaugh$1, javap -p -c SingleTonBillPaugh\$1 it, :
class SingleTonBillPaugh$1 {
}
, , , . , , - SingleTonBillPaugh$SingleTonHelper javap -p -c SingleTonBillPaugh\$SingleTonHelper:
class SingleTonBillPaugh$SingleTonHelper {
private static final SingleTonBillPaugh instance;
SingleTonBillPaugh$SingleTonHelper();
Code:
0: aload_0
1: invokespecial #2 // Method java/lang/Object."<init>":()V
4: return
static SingleTonBillPaugh access$000();
Code:
0: getstatic #1 // Field instance:LSingleTonBillPaugh;
3: areturn
static {};
Code:
0: new #3 // class SingleTonBillPaugh
3: dup
4: aconst_null
5: invokespecial #4 // Method SingleTonBillPaugh."<init>":(LSingleTonBillPaugh$1;)V
8: putstatic #1 // Field instance:LSingleTonBillPaugh;
11: return
}
, ( ) ( null).
, , — . , String SingleTonHelper, "", SingleTonBillPaugh(String, SingleTonBillPaugh$1).
:
sysout , ( ), sysout. ? , pvt?
, . , -:
SingleTonBillPaugh.java:
public class SingleTonBillPaugh
{
public static SingleTonBillPaugh getInstance()
{
return SingleTonHelper.instance;
}
private SingleTonBillPaugh()
{
System.out.println(Thread.currentThread().getName() + " instance is going to be created");
}
static class SingleTonHelper
{
private static final SingleTonBillPaugh instance = new SingleTonBillPaugh();
}
}
, javap -p -c SingleTonBillPaugh, :
public class SingleTonBillPaugh {
public static SingleTonBillPaugh getInstance();
Code:
0: invokestatic #2
3: areturn
private SingleTonBillPaugh();
Code:
0: aload_0
1: invokespecial #3
4: getstatic #4
7: new #5
10: dup
11: invokespecial #6
14: invokestatic #7
17: invokevirtual #8
20: invokevirtual #9
23: ldc #10
25: invokevirtual #9
28: invokevirtual #11
31: invokevirtual #12
34: return
SingleTonBillPaugh(SingleTonBillPaugh$1);
Code:
0: aload_0
1: invokespecial #1
4: return
}
, SingleTonBillPaugh(SingleTonBillPaugh$1), , :
SingleTonBillPaugh(SingleTonBillPaugh$1 unused) {
this();
}