2014-01-29 2 views
0

У меня есть класс с несколькими общественными методами.Как ограничить вызов методов клиентами?

public class Sample{ 

    public void method1(){ } 

    public void method2(){ } 

    public void method3(){ } 

    public void method4(){ } 
} 

мне нужно выставить только первые три метода для клиентов и не method4(). Как я могу создать еще один класс, отображающий только первые 3 метода?

+0

Возможный дубликат http://stackoverflow.com/questions/215497/in-java-wha ts-the-difference-between-public-default-protected-and-private –

+0

Я не могу перейти на приватный. Потому что, когда я создаю экземпляр одного класса, я должен иметь возможность вызвать метод4. – user755806

+3

Тогда что вы имеете в виду, не подвергая его воздействию? – Alex

ответ

1

Для того, чтобы общественный класс, который предлагает методы 1-3 только, завернуть Sample в другом классе, как это:

public class RestrictedSample { 

    private Sample sample = new Sample(); 

    public void method1(){ sample.method1(); } 

    public void method2(){ sample.method2(); } 

    public void method3(){ sample.method3(); } 
} 

Это известно как façade pattern, или просто delegation.

Будьте предупреждены: до тех пор, пока Sample остается общедоступным, другой код может создавать экземпляры этого класса. Для вас это не проблема, но это стоит вспомнить.

+0

Дункан, идея заключается в том, что через клиенты класса RestrictedSample можно установить данные в образец объекта. Теперь, как я могу получить один и тот же объект-образец? Если я предоставляю метод getter, клиенты могут получить доступ к объекту образца, который я не хочу делать. – user755806

+0

@ user755806 Предоставьте методы настройки в 'RestrictedSample', которые настраивают внутренний экземпляр' sample'. –

+0

то как я могу получить данные, которые находятся в экземпляре образца? – user755806

0

Улучшенный контроль над видимостью - одна из основных вещей, которые OSGi добавляет к Java. Если это серьезный проект, вы можете рассмотреть возможность инвестирования в обучение OSGi.

Если это то, что вы делаете для себя или для класса, вы можете рассмотреть что-то более слабое, но более простое, например, пометить метод устаревшим или просто переименовать его в INTERNAL_USE_ONLY_method4.

Или оставьте метод «доступным» пакетом.

2

создать интерфейс, который разоблачить только 3 метода:

public interface ISample{ 
    public void method1(); 
    public void method2(); 
    public void method3(); 
} 

Пусть класс реализовать:

public class Sample implement ISample { 
// all method definitions are not changed 
} 

Когда необходим полный доступ, использовать тип Sample, при ограничении, то ISample:

Sample sample=new Sample(); 
sample.method4(); 
passToUser((ISample)sample); 
+0

Я предполагаю, что 'passToUser' принимает экземпляры' ISample'? Если это так, бросок не нужен. Также обратите внимание, что префикс 'I' очень распространен в .NET, но обычно не используется в Java. –

+0

Этот подход также является ошибочным, поскольку код, получающий экземпляр 'ISample', может передать его в« Sample »и получить доступ к скрытому методу. –

+0

@ Duncan злонамеренный клиент может прочитать RestrictedSample.sample из вашего варианта с использованием отражения, небезопасного или JNI. Мы не знаем требуемого уровня защиты - возможно, мой вариант в порядке, возможно, ваш вариант небезопасен. –

Смежные вопросы