作为库作者,期望用户根据情况将null传递给方法参数是否设计不当?

gjvatsalya:

我试图编写一个供外部用户使用的库,但我坚持一些基本的设计决策。

我正在编写一个简单的POJO类,其中将包含有关OAuth2令牌的一些信息。

本课程将需要满足以下条件:

  • 如果令牌是永久令牌,则用户仅需要传递令牌。
  • 如果令牌是临时令牌,则用户需要传递令牌,expirationDate和refreshToken。
  • 永远不会出现这样的情况:expirationDate和refreshToken中只有一个为null。两者都将为null或两者都将为非null。

这是我到目前为止所拥有的:

public TokenInformation(String token, Date expirationDate, String refreshToken) {
    Objects.requireNonNull(token, "token parameter cannot be null.");
    this.token = token;

    if ((expirationDate != null) && (refreshToken != null)) {
        this.expiresIn = expiresIn;
        this.refreshToken = refreshToken;
        isPermanentToken = false;
    } else if ((expirationDate == null) && (refreshToken == null)) {
        this.expiresIn = null;
        this.refreshToken = null;
        isPermanentToken = true;
    } else {
        // throw some exception here
    }
}  

老实说,我对代码的外观并不完全满意。

但是我确实有以下想法:

  • 有两个构造函数。一个仅具有一个参数(用于永久令牌),另一个具有所有三个参数(临时令牌)。但是,我担心的是,用户将无法正确阅读文档,并将永久令牌构造函数用作临时令牌。
  • 有两个不同的工厂方法而不是构造函数。这些工厂方法将被清楚地命名,因此用户使用错误方法的机会将很小。此外,不会强迫用户明确传递null。

我认为第二个想法可能是最好的方法。例如,我想不出任何要求我们传递null的Java API,这可能暗示我粘贴的代码是个坏主意。另外,Java充分利用了工厂方法,因此对于我的库用户而言,这将不是一个陌生的模式。

不过,我希望别人的意见。因此,如果您需要其他任何信息,请告诉我。

DHRUV班沙尔:

我希望将永久令牌和临时令牌的行为封装到各自的域中,以便您的库中的任何用户都清楚知道要实例化哪种令牌

我认为建议的课程:

/**
 * The base class encapsulates the behavior of generic token
 */
public class AbstractToken {

    protected String token;

    // other properties that exist very closely with token

    public String getToken() {
        return token;
    }
}

永久令牌域

/**
 * The domain encapsulates the behaviour of Permanent token - token that never expires
 */
public class PermanentToken extends AbstractToken {

    // more attributes that makes general token as Parmament token

    /**
     * Instantiates a new Permanent token - this token never expires
     *
     * @param token the token
     */
    public PermanentToken(String token) {
        this.token = token;
    }
}

临时令牌的域:

/**
 * The domain for Temporary token.
 */
public class TemporaryToken extends AbstractToken {

    private Date expirationDate;
    private String refreshToken;

    // more attributes that makes general token as temporary token

    /**
     * Instantiates a new Temporary token with token expiry date and refresh token
     *
     * @param token          the token
     * @param expirationDate the expiration date
     * @param refreshToken   the refresh token
     */
    public TemporaryToken(String token, Date expirationDate, String refreshToken) {
        this.token = token;
        this.expirationDate = expirationDate;
        this.refreshToken = refreshToken;
    }
}

现在,您的图书馆用户清楚地知道他/她想实例化和使用哪种令牌。

附言:我想您将能够为您的域名保留更好的名称,并且可以为您的图书馆提供更深入的业务。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将子类传递给方法,但将超类作为参数?

如何将null传递给期望long或int的方法?

将超类作为参数传递给期望子类的方法

是否可以将validatedBy属性作为参数传递给注释?

将byte []作为单个参数传递给vararg方法

将异常作为参数传递给Java中的方法是否是错误的做法

是否有将FXML控制器引用作为参数传递给方法的通用方法?

是否可以将内插字符串作为参数传递给方法?

如何将熊猫数据框作为参数传递给matplotlib库方法图

是否可以将列作为参数传递给ODER BY子句?

Jenkins共享库:是否可以将参数传递给作为“ libraryResource”导入的shell脚本?

将self作为参数传递给方法

将方法作为参数传递给小部件

是否可以修改作为参数传递给类的方法

是否可以在不为该数组创建变量的情况下将数组作为参数传递给函数?

将函数作为参数传递给方法

Delphi和COM:是否可以将TClientDataset作为参数传递给COM库?

C#-将委托作为参数传递给方法

C ++将方法的指针数组作为参数传递给方法

是否可以将选择器或方法签名作为参数传递给Objective-C?

将Null作为参数传递给控制器POST方法

将lambda函数作为参数传递给需要接口的方法

避免将null传递给构造函数作为参数

将 NULL 作为参数传递给 C 宏

将 null 作为 vararg 参数的一部分从 Kotlin 传递给 Java 方法

Rails:在传递给模型之前根据用户类型修改参数的设计模式

将变量作为参数传递给用户控件

将 null 作为参数传递给 listOf

RxJava - 将 Observable 作为参数传递给方法