2014-09-09 5 views
0

Интересно, можно ли ограничить метод, который будет вызываться только одним классом в java.Метод лимитного вызова для одного класса

public interface IAuditingEventHandler { 
    public void handleEvent(BaseEventType event); 
} 

public class EDAEventHandler implements IAuditingEventHandler { 
    //should be callabe only from MultiInstanceAuditingEventHandler 
    @Override 
    public void handleEvent(BaseEventType event)... 
} 


public class DBEventHandler implements IAuditingEventHandler { 
    //should be callabe only from MultiInstanceAuditingEventHandler 
    @Override 
    public void handleEvent(BaseEventType event)... 
} 

public class MultiInstanceAuditingEventHandler implements IAuditingEventHandler { 

    private final List<IAuditingEventHandler> eventHandlers; 

    public MultiInstanceAuditingEventHandler(List<IAuditingEventHandler> eventHandlers) { 
     this.eventHandlers = eventHandlers; 
    } 

    // can be called from everywhere 
    @Override 
    public void handleEvent(BaseEventType event) { 
     for (IAuditingEventHandler eventHandler : eventHandlers) { 
       eventHandler.handleEvent(event); 
     } 
    } 
} 

Как вы можете видеть, у меня есть два класса с методом handleEvent, который должен быть вызван только из одного конкретного класса MultiInstanceAuditingEventHandler. Остальная часть кода должна иметь возможность вызывать только один конкретный класс MultiInstanceAuditingEventHandler.

Целью этого является наличие прокси-сервера, который знает, какие экземпляры должны быть вызваны, и каждый пользователь этого кода должен вызывать этот прокси-сервер.

Есть ли способ достичь этого в Java? Может быть, какой-то узор или какая-то наследующая магия?

Спасибо, Sven

Update

Видя, что не достаточно хорошо программирования решения мудрого, может быть, есть некоторые тестовые инструменты, которые делают анализ кода и может убедиться, что ни один из классов методы называются?

+7

вы не можете поместить их в одном пакете и дать только пакетный доступ к методам handleEvent? – Adi

+1

Что произойдет, если вы не сможете этого предотвратить? Вы можете проверить это во время выполнения, однако в целом это не стоит лишней сложности. –

+0

Защита пакетов была единственным решением, которое пришло в наш ум. Недостатком является то, что все еще можно вызвать методы из этого пакета. Однако можно создать пение le пакет для него. – sveri

ответ

0

Если у вас есть классы в одном пакете, вы можете удалить модификатор public из своего метода (в интерфейсе и в реализации), чтобы сделать его package-private. (См Controlling Access to Members of a Class)

Или, если вы хотите ограничить доступ к только от MultiInstanceAuditingEventHandler, вы можете прочитать трассировки стека во время выполнения, но вы должны сделать это в каждом методе реализующего индивидуально. (Также это похоже на обман, и я бы отговорил этот вариант.)

0

Опция «private package» была описана другим ответом. (А вы, видимо, уже считали.

Другим вариантом было бы объявить EDAEventHandler и DBEventHandlerв пределахMultiInstanceAuditingEventHandler класса, и объявить их как private static.