Связать методы и поля классов
Мне необходимо смоделировать игровые автоматы с магнитными лентами,на которых хранится только баланс,номер и ничего больше.Терминалом,через который можно пополнять баланс и обменивать заработанные очки на призы. А также играми,где эти очки зарабатываются.
Так вот,суть вопроса в следующем:как связать между собой классы.То есть чтобы пополнять баланс можно было только через терминал.Но при этом и в играх и терминале используются поля магнитных карт,которые являются отдельным классом
Ответы (1 шт):
Вариант №1
Я бы предложил создать аннотацию. Например, Replenishable
package com.example;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Аннотация, определяющая, что классу разрешено пополнение
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Replenishable { }
Далее пометил бы этой аннотацией класс Terminal, которому разрешено пополнение:
@Replenishable
public class Terminal {
public Map.Entry<Boolean, String> replenish(String accountNumber, BigDecimal amount) {
//some logic
}
}
И в методе-обработчике проверил, что оплату осуществлял класс, который соответствующим образом аннотирован:
Replenishable isReplenishable = terminalObject.getClass().getAnnotation(Replenishable.class);
if (Objects.nonNull(isReplenishable)) {
//receive payment
} else {
throw new RuntimeException("Пополнение счёта произведено из неавторизованного источника");
}
В итоге, когда мы хотим добавить какому-то классу возможность пополнения, то мы просто аннотируем его (терминалы, игры и т.д.).
Вариант №2
Использовать интерфейсы:
- Создадим интерфейс
Replenishable - Имплементируем его в
TerminalиGame - Внутри обработчика проверим, что объект реализует
Replenishable:
public static boolean isReplenishable(Class<?> clazz) {
Class<?>[] interfaces = clazz.getInterfaces();
return Arrays.asList(interfaces).contains(Replenishable.class);
}
Вариант №3
Использовать наследование:
- Создать абстрактный класс
Replenishable - Наследовать от него
TerminalиGame - При помощи Reflection Api проверить, что кто-то из цепочки родителей является
Replenishable.
public static boolean isReplenishable(Class<?> clazz) {
boolean contains = false;
do {
contains = clazz.isAssignableFrom(Replenishable.class);
Class<?> superClass = clazz.getSuperclass();
if (superClass == null) {
break;
}
clazz = superClass;
} while (!contains || !"java.lang.Object".equals(clazz.getCanonicalName()));
return contains;
}