有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何避免接口方法的空实现

我的设计可能也有一些问题。我的问题是:

我有一个抽象的处理程序,首先

  • 获取IUser(获取具有实现逻辑的用户)
  • 然后调用IUser的IRole对象的函数(使用实现逻辑获取角色)

所以在设计之初

  • 每个IUser实现都有一些IRole逻辑
  • 这些是分开的,因为它们是单独微服务中的单独rest调用
  • 但我把他们和IUser联系在一起有个IRole关系

但是现在有一些实现,一些IUser的实现不应该有IRole对象。所以现在我为这个实现返回null,我不喜欢它。我曾想过拆分接口,但也找不到AbstractCustomAuthHandler能够满足的解决方案。下面是一个图表和代码:

Here is the design for the auth

下面是AbstractCustomAuthHandler的某些部分

IUser userAuth= this.getUserAuth();
final Response userResponse= userAuth.findUser();
// ...
Map<String, Object> attributes= userAuth.getMappedAttributes();
// ...
IRole roleAuth= userAuth.getRoleAuth();
if (roleAuth!= null)
{
    final Response rolesResponse = roleAuth.findRolesBy();
}
// ....

下面是AuthMethodWithoutRole,我在返回null时遇到问题

public class AuthMethodWithoutRole implements IUser
{
    @Override public Response findUserBy( )
    {
        // some logic
    }

    @Override public IRole getRoleAuth( )
    {
        return null;
    }
}

这是IUser接口

public interface IUser extends IAuth
{
    Response findUserBy();

    IRole getRoleAuth();
}

这是IRole接口

public interface IRole
{
    Response findRolesBy( );
}

共 (2) 个答案

  1. # 1 楼答案

    如果您真的想从AbstractCustomAuthHandler中删除角色检查,您应该重新考虑您的设计。您可以移动IUser类/子类中使用角色的逻辑
    这样,每个IUser实现都将在需要时使用它
    这种方法听起来像是DDD方法。使对象根据其性质/定义进行协作,不要让人工对象执行整个逻辑(AbstractCustomAuthHandler

    这一逻辑:

    IUser userAuth= this.getUserAuth();
    final Response userResponse= userAuth.findUser();
    // ...
    Map<String, Object> attributes= userAuth.getMappedAttributes();
    // ...
    IRole roleAuth= userAuth.getRoleAuth();
    if (roleAuth!= null)
    {
        final Response rolesResponse = roleAuth.findRolesBy();
    }
    

    将在IUser中完成:

    IUser userAuth= this.getUserAuth();
    Response response = userAuth.computeResponse(...);
    

    或者可能:

    ResponsePart responsePart = userAuth.computeSomePartOfTheResponse(...);
    // and use responsePart  to complete the logic.
    

    当然IUser子类可以依赖于在超类或接口中定义的一些基本方法来执行公共逻辑


    如果您不想改变方法,也就是说,您想继续检索IUser对象的角色信息,以便让另一个类(AbstractCustomAuthHandler)使用它,那么您需要为操纵它们的类统一操纵IUser
    因此,即使对于没有空角色或空角色的子类,也需要为实现提供空角色或空角色
    我不认为这是一个设计问题,如果你遵循这种方法。作为改进,你可以考虑:

    • 在返回null的接口中定义默认实现

    • 或者将返回类型更改为Optional<Role>,并在返回empty可选值的接口中定义默认实现

    这将使:

    public interface IUser extends IAuth
    {
        Response findUserBy();
    
        default Optional<IRole> getRoleAuth(){return Optional.empty()}
    }
    

    现在,仅在需要时重写该方法

  2. # 2 楼答案

    为什么不创建一个类NullRole实现IRole? 因此,您不需要authMethodWithout角色。您只需使用默认的AuthMethod处理“NullRole”