Как сделать метод класса доступным только для другого класса?

93
14

Кроме того, существует класс "Рабочий", в котором один из его атрибутов представляет собой очередь объектов "WorkOrder" и класс "Boss", который является единственным, который может добавлять или удалять новые "WorkOrders" этой очереди. Как можно сделать способ, который изменяет очередь, доступную только "Боссом"?


Я подумал о двух решениях:


(a) Сделайте метод package-private, сохраните два класса в одном пакете и создайте их в другом.


(b) Создайте интерфейс с методами, к которым может обратиться "Рабочий", создайте конструктор этого класса private и создайте вместо него статический метод, который возвращает объект с тем же типом, что и интерфейс.


Каково ваше мнение? Можете ли вы придумать более элегантное решение?

спросил(а) 2021-01-19T18:31:35+03:00 9 месяцев, 1 неделя назад
1
Решение
66

Подумайте о наличии интерфейса, который предоставляет методы работы, которые вы хотите публиковать. Хозяин может содержать ссылку на реализацию (которая имеет очередь очереди рабочих порядков) и представляет только интерфейс для других классов.

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;

class Class {
public static void main(final String... args) {
final Boss boss = new Boss();
final Worker worker = boss.getWorker("sivmish");
worker.getWorkItems();//ERROR: only Boss has access to this.
}
}

interface Worker {
void processWork();
}

interface WorkOrder {
void doWork();
}

class WorkerImpl implements Worker {
private final Queue<WorkOrder> workItems;

WorkerImpl() {
this.workItems = new ArrayDeque<>();
}

public Queue<WorkOrder> getWorkItems() {
return workItems;
}

@Override
public void processWork() {
while (!workItems.isEmpty()) {
workItems.poll().doWork();
}
}
}

class Boss {
private final Map<String, WorkerImpl> workersByName;

Boss() {
workersByName = new HashMap<String, WorkerImpl>();
}

public Worker getWorker(final String name, WorkOrder... workOrders) {
if (!workersByName.containsKey(name)) {
final WorkerImpl worker = new WorkerImpl();
workersByName.put(name, worker);
}
final WorkerImpl worker = workersByName.get(name);
worker.getWorkItems().addAll(Arrays.asList(workOrders));
return worker;
}
}

ответил(а) 2021-01-19T18:31:35+03:00 9 месяцев, 1 неделя назад
46

Я предпочел бы сохранить очередь в классе Boss, потому что вы хотите сделать ее доступной только для Boss для добавления или удаления

class Boss
{
public LinkedList<E> queue = new LinkedList<E>();
private void add(item)
{
//do stuff...
}
private void remove()
{//do stuff...}
public static void viewOnly()
{
//display details
}

}

class Workers
{
public workers()
{
Boss.viewOnly();
}
}

class Main
{
public static void main(String args[])
{
Boss b = new Boss();
b.add(1); //job 1
b.add(5); //job 5
/* and so on..

*/
workers w = new workers();
}
}

ответил(а) 2021-01-19T18:31:35+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема