2013-04-12 6 views
9

Ich habe eine Klasse mit einer Methode, die ich nur für seine untergeordneten Objekte zugänglich sein möchte, und nicht für andere Klassen in diesem Paket.Java zwischen privat und geschützt

Modifier | Class | Package | Subclass | World 
————————————+———————+—————————+——————————+——————— 
public  | ✔ | ✔ | ✔  | ✔ 
————————————+———————+—————————+——————————+——————— 
protected | ✔ | ✔ | ✔  | ✘ 
————————————+———————+—————————+——————————+——————— 
no modifier | ✔ | ✔ | ✘  | ✘ 
————————————+———————+—————————+——————————+——————— 
private  | ✔ | ✘ | ✘  | ✘ 
____________+_______+_________+__________+_______ 
my Modifier | ✔ | ✘ | ✔  | ✘ 
____________+_______+_________+__________+_______ 

Gibt es einen Workaround, um diese Art von Modifikator zu haben?

Vielleicht gibt es eine Möglichkeit, ein Paket endgültig zu machen, damit andere Programmierer keine Klassen in mein Paket hinzufügen können?

Oder gibt es eine Möglichkeit, die Instanz zu erhalten, die die Funktion aufgerufen hat, und zu prüfen, ob diese eine Instanz meines Objekts super ist?

Oder muss ich es einfach verlassen, und nur geschützt verwenden, und andere Programmierer könnte Klassen zu meinem Paket hinzufügen ...

+1

+1 für ASCII malen – mKorbel

+0

@m Korbel definitiv, OP scheint, erhebliche Anstrengung dafür gesetzt zu haben =) – Juvanis

+0

@mKorbel ich erweiterte diese ascii Tabelle von [diesem] (http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between -public-default-protected-and-private? rq = 1) thread: – Jetse

Antwort

6

1) Sie können eine benutzerdefinierte acceess Modifikator in Java erstellen

2) Sie können ein Paket in einem Glas verschließen, http://docs.oracle.com/javase/tutorial/ext/security/sealing.html

3) sehen Sie die anrufende Klasse finden können, versuchen

public static void main(String[] args) throws Exception { 
    xxx(); 
} 

static void xxx() { 
    Class[] cc = new SecurityManager() { 
     @Override 
     protected Class[] getClassContext() { 
      return super.getClassContext(); 
     } 
    }.getClassContext(); 
    System.out.println(cc[cc.length - 1].getName()); 
}