2015-11-20 17 views
8

NOTA: Questa è una domanda con risposta personale. Potrebbe essere molto semplice, ma ho pensato che sarebbe valsa la pena condividerlo.Qual è il modificatore di accesso del costruttore di una classe anonima?

Supponiamo che io sono una dichiarazione di classe anonima:

MyObject myObj1 = new MyObject() { 

}; 

dove MyObject è:

class MyObject { 

    public MyObject() { // explicit public constructor 
    } 

    ... 
} 

Da this section del Java Language Specification (sottolineatura mia):

Un anonimo la classe non può avere un costruttore dichiarato esplicitamente. Invece, un costruttore anonimo viene implicitamente dichiarato per una classe anonima.

Se cerco di ottenere il numero di public costruttori:

// Number of public constructors; prints 0 
System.out.println(myObj1.getClass().getConstructors().length); 

esso stampa zero come previsto, vale a dire il costruttore anonimo non è public.

Inoltre non private, poiché se chiamiamo seguente da una classe differente nella stessa confezione in cui è definita la classe anonima (passando intorno l'istanza myObj1):

myObj1.getClass().getDeclaredConstructor().newInstance(); 

compie colpo e IllegalAccessException.

Qual è il modificatore di accesso del costruttore implicito in una classe anonima?

+0

Cosa ti ha portato a svolgere questa indagine? – dnault

+0

@dnault Mi stavo chiedendo l'uso (concettuale) di una classe anonima come un singleton e ho pensato al costruttore. – manouti

+0

Che differenza fa? Non puoi chiamarlo. – EJP

risposta

9

Il costruttore anonimo agisce in modo simile allo default constructor che il compilatore crea anche per una classe normale che non dichiara i costruttori. In questo caso:

In un tipo di classe, se la classe è dichiarata public, quindi il costruttore di default è implicitamente dato il modificatore di accesso public (§6.6); se la classe è dichiarata protected, il costruttore predefinito assegna implicitamente il modificatore di accesso protected (§6.6); se la classe è dichiarata private, il costruttore predefinito assegna implicitamente il modificatore di accesso private (§6.6); in caso contrario, il costruttore predefinito ha l'accesso predefinito implicito da nessun modificatore di accesso.

In altre parole, il costruttore anonimo è accessibile solo nello stesso pacchetto della classe anonima.