powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по ООП
25 сообщений из 35, страница 1 из 2
Вопрос по ООП
    #39190497
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 @Service
class A{
   A(){
       new B(this);
}
  public void somePublicMethod(){
   }
} 


Класс B
Код: java
1.
2.
3.
 
class B implements Runnable{
}


Как сделать так, чтобы somePublicMethod был доступен только классу B?
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190500
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нестед не предлагать, класс В большой и я не хочу держать его в А. Есть еще рефлекшн, но не нравится. Еще есть варианты какие-то?
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190504
Kenny Fartman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенести somePublicMethod в B
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 


Класс B

 
class B implements Runnable{
public void somePublicMethod(){
   }
}
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190542
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему такая шняга называется друзья классов. Не проверял, но мб прокатит:Заменить сампабликметод на прртектед, добавить пустой класс в A (Afriend) , сделать B extends Afriend implements...
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190569
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В классе А(который синглтон), хранится мапа, которая является общей для всех экземпляров В. В классе А есть метод для удаления элемента из мапы:
public removeTask. Мне очень не нравится, что этот метод паблик, т.к. любой может вызвать его и удалить элемент. Сделать приват, тогда не будет доступа из В. Хранить мапу в В тоже не вариант, т.к. это раннейбл и он убивается в определенный момент времени.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190578
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTВ классе А есть метод для удаления элемента из мапы:
public removeTask. Мне очень не нравится, что этот метод паблик, т.к. любой может вызвать его и удалить элемент.
вы путаете стройную Модель с правами.
Сделайте чтобы любой не мог вызвать другими средствами.
public removeTask - интерфейс класса чтобы с ним можно было работать снаружи.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190579
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
есть ещё модификаторы доступа в пределах пакета. Снаружи пакета никто не вызовет. А в пакете никто кроме тебя не напакостит.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190587
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892По моему такая шняга называется друзья классов. Не проверял, но мб прокатит:Заменить сампабликметод на прртектед, добавить пустой класс в A (Afriend) , сделать B extends Afriend implements...

"пустой класс в A"

а может интерфейс ?
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190601
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class A {
    
    public A() {
        new B(this);
    }

    public void somePublicMethod() {
        String caller = Thread.currentThread().getStackTrace()[2].getClassName();
        if (!caller.equals(B.class.getName())) {
            throw new IllegalAccessError("Not allowed");
        }
        // ...
    }
}
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190607
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanJulT,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class A {
    
    public A() {
        new B(this);
    }

    public void somePublicMethod() {
        String caller = Thread.currentThread().getStackTrace()[2].getClassName();
        if (!caller.equals(B.class.getName())) {
            throw new IllegalAccessError("Not allowed");
        }
        // ...
    }
}


Круто, спасибо. Интересно, как часто используется такой подход?
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190613
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Это грязный хак .
имхо
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190617
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanJulT,

Это грязный хак .
имхо
+1))
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190627
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
если вы расширите описание задачи, то возможно и решений будет больше.
- если это сервисный слой и БЛ, то почему класс В такой тупой и ему нужен метод somePublicMethod из внешнего класса. Тогда перенести поведение (метод) в этот класс.
- если тут потоки, то почему синглетон? Для того чтобы конкурентности было выше?
- если в методе только какие то вычисления без состояния, то можно вынести эти методы в статический класс с именем С. Запуск будет делать А, а В использовать справочный метод у С.
imho
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190649
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 @Service
class A{
   A(){
       new B(this);
}
  public void somePublicMethod(){
   }
} 


Класс B
Код: java
1.
2.
3.
 
class B implements Runnable{
}


Как сделать так, чтобы somePublicMethod был доступен только классу B?

1. Если бы это был eiffel то легко. Но, увы, Гослинг не читатель, Гослинг писатель - он ничего кроме С++ не изучал :(

2. Сложить в один пакет и надеяться, что никто не будет достаточно настырным, чтобы не назвать пакет так же.

3. Сделать метод protected, а в B внутреннего наследника. Но это каждый дурак может.

4. Подумать, зачем тебе это надо и понять, то этого НЕ надо.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190664
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также можно реализовать через АОП:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class AspectForA {

    // Перед вызовом somePublicMethod() проверяем вызывающего: если это не B, тада ашыпка
    @Before("call(* org.example.A.somePublicMethod(..)) && !this(org.example.B)")
    public void beforeSomePublicMethod() {
        throw new IllegalAccessError("Not allowed");
    }
}
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190669
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTВ классе А(который синглтон), хранится мапа, которая является общей для всех экземпляров В. В классе А есть метод для удаления элемента из мапы:public removeTask.

Если для всех В общий, то так:

Код: java
1.
2.
3.
4.
5.
6.
7.
class B implements Runnbale{

private static final Map mapa = new HashMap()
private static void removeTask(){}

...
}



JulTХранить мапу в В тоже не вариант, т.к. это раннейбл и он убивается в определенный момент времени.
Еще для такого можно использовать Weak мапу. Но там надо смотреть подробней. Этот вариант может подойти не всегда.

И кстати, в конструкторе публиковать this в другой калсс - говнокод, плохо, не exception-frendly.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190692
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
если вы расширите описание задачи, то возможно и решений будет больше.
- если это сервисный слой и БЛ, то почему класс В такой тупой и ему нужен метод somePublicMethod из внешнего класса. Тогда перенести поведение (метод) в этот класс.
- если тут потоки, то почему синглетон? Для того чтобы конкурентности было выше?
- если в методе только какие то вычисления без состояния, то можно вынести эти методы в статический класс с именем С. Запуск будет делать А, а В использовать справочный метод у С.
imho
Краткое описание задачи:
Пользователь создает заказ, получаем id заказа для которого необходимо в отдельном потоке запустить поиск исполнителя заказа.
Создание заказа происходит в сервисном классе А, здесь же лежит мапа
Код: java
1.
Map<id заказа, B> tasks = new ConcurrentHashMap<>();

для хранения запущенного на выполнение экземпляра B(implements Runnable). Мапа нужна для того, чтобы никто больше не смог запустить другой поток поиска для этого же заказа. В классе В начинается карусель, которая останавливается когда находится исполнитель, в этот момент в В я вызываю метод из А, который чистит мапу по текущему id заказа (tasks.remove(id)). Синглетоном у меня является только сервисный класс А.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190694
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне одному кажется, что решение какое-то запутаное у автора?

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

p.s. возможно нужно пересмотреть общий подход к решению
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190698
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО Да, здесь что-то не так. К тому же это не будет работать в кластере (я так понимаю В так или иначе обращается к БД)
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плюсую к AOP.

Добавлю еще.

У Хостмана есть пример. Вполне себе коробочное решение для изысканных запретов на какое-то действие.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class JultSecurityManager extends SecurityManager{
   public void checkPermission(Permission p){
    ....
}


public void somePublicMethod(){
      JultSecurityManager security = new JultSecurityManager();
      .....
}

....


$ java -Djava.security.policy=JultPermission.policy .....
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190733
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174мне одному кажется, что решение какое-то запутаное у автора?

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

p.s. возможно нужно пересмотреть общий подход к решению
Поиск исполнителя это всего лишь поиск доступных, далее я беру список доступных и по очереди, в течении определенного времени(например 20 секунд) каждому из них предлагаю взять заказ на исполнение(шлю нотификацию). Как только заказ взят кем-то, поиск прекращается, поток останавливается, а заказ удаляется из мапы. Пока сделала так, если есть варианты как проще, советуйте. И спасибо всем откликнувшимся)
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190734
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПлюсую к AOP.

Добавлю еще.

У Хостмана есть пример. Вполне себе коробочное решение для изысканных запретов на какое-то действие.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class JultSecurityManager extends SecurityManager{
   public void checkPermission(Permission p){
    ....
}


public void somePublicMethod(){
      JultSecurityManager security = new JultSecurityManager();
      .....
}

....


$ java -Djava.security.policy=JultPermission.policy .....


Мэрси)
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190735
skywriter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin3. Сделать метод protected, а в B внутреннего наследника. Но это каждый дурак может.

А чего НЕ может "каждый дурак" (если захочет), с учётом наличия reflection API?
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190768
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTКак сделать так, чтобы somePublicMethod был доступен только классу B?Убрать public и разместить классы в одном пакете.
Опционно - выставить "Sealed: true" в манифесте jar-файла.
...
Рейтинг: 0 / 0
Вопрос по ООП
    #39190787
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovУбрать public и разместить классы в одном пакете.
+1
А то наворотить можно...проверяльщиков прав в самой модели. Т.е. кроме бизнес-логи ещё и Системную логику.
JulTПоиск исполнителя это всего лишь поиск доступных, далее я беру список доступных и по очереди, в течении определенного времени(например 20 секунд) каждому из них предлагаю взять заказ на исполнение(шлю нотификацию). Как только заказ взят кем-то, поиск прекращается, поток останавливается, а заказ удаляется из мапы. Пока сделала так, если есть варианты как проще, советуйте.
Без аппСервера, в БД делают разные бизнес процессы:
- Один БП по заведению задачи разбивают на 2-3 - Сохранить задачу + Поиск исполнителей по JOB + Мессенджер.
У тебя получается что при Новогодних праздниках зависнет N заданий (не будут удалены из мапы).
Т.е. постоянно шуршит сервер.
Все 3 модуля можно выполнить независимыми друг от друга.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по ООП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]