实现具有不同参数类型的相同方法的抽象类-Java / OOP

时间:2019-03-09 18:17:29

标签: java oop abstraction

我有正在重构的工作代码,以使其更具可读性/遵循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中这种方式是否有效。例如,仅在采用相同arg类型的情况下才重写Interface方法。

所以这是一个问题:我有3个类,所有这些类都实现了返回getTags的方法Iterable<Tag>。每个参数均采用不同的arg类型作为参数,并且具有从该对象返回标签的某些行为。我不想做诸如类型转换之类的丑陋事情。正确的抽象是什么?您将如何重构此代码?

0 个答案:

没有答案