Абстрагирование классов, которые реализуют один и тот же метод с разными типами аргументов - Java / OOP - PullRequest
0 голосов
/ 09 марта 2019

У меня есть рабочий код, который я реорганизую, чтобы сделать его более читабельным / следуйте соглашениям Java / OOP.

Я поделюсь этим кодом, а затем поделюсь некоторыми мыслями:

public class AbstractTaggingService {

@Autowired
private JoinPointTaggingService joinPointTaggingService;

@Autowired
private StackTraceTaggingService stackTraceTaggingService;

@Autowired
private UserTaggingService userTaggingService;

public Iterable<Tag> getTags(ProceedingJoinPoint joinPoint, MetricsContextHolder contextHierarchy, Authentication authentication){
    return Tags.of(
        Iterables.concat(
            joinPointTaggingService.getTags(joinPoint),
            stackTraceTaggingService.getTags(contextHierarchy),
            userTaggingService.getTags(authentication)
        )
    );
}

.

public class JoinPointTaggingService {

public Iterable<Tag> getTags(ProceedingJoinPoint joinPoint) {

    return Tags.of(
        "methodName", joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName(),
        "parameters", parameters.toString()
    );
}

.

public class StackTraceTaggingService {

public Iterable<Tag> getTags(MetricsContextHolder contextHolder) {
    Stack<MetricsContext> contextHierarchy = contextHolder.getStack();
    return Tags.of(
        "trace", contextHierarchy.toString(),
        "parent", getParent(contextHierarchy),
        "children", contextHierarchy.peek().childrenToString(),
        "threadID", contextHolder.getID()
    );
}
}

.

public class UserTaggingServiceImpl implements UserTaggingService {

@Override
public Iterable<Tag> getTags(Authentication authentication) {
    OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
    return Tags.of(
        "user", getUserName(authentication),
        "auth_session_id", getUserSessionID(details)
    );
}
}

Я думал, что все эти отдельные службы тегирования должны быть абстракциями некоторого абстрактного сервиса тегирования, гдесервис будет вызван и определит правильный сервис для использования на основе типа arg (перегрузка).

Однако я не знаю, как это работает в Java OOP.Метод интерфейса переопределяется, только если он принимает, например, те же типы аргументов.

Итак, вот вопрос: у меня есть 3 класса, которые все реализуют метод getTags, который возвращает Iterable<Tag>.Каждый принимает в качестве параметра свой тип аргумента и имеет некоторое поведение для возврата тегов из этого объекта.Я не хочу делать что-то уродливое, например, приведение типов и т. Д. Какая правильная абстракция? Как бы вы реорганизовали этот код?

...