gpt4 book ai didi

java - 作为库作者,期​​望用户根据情况将 null 传递给方法参数是不是很糟糕的设计?

转载 作者:行者123 更新时间:2023-11-30 05:43:48 26 4
gpt4 key购买 nike

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

我正在编写一个简单的 POJO 类,它将保存一些有关 OAuth2 token 的信息。

该类需要满足以下条件:

  • 如果 token 是永久 token ,则用户只需传递 token 即可。
  • 如果 token 是临时 token ,则用户需要传递 token 、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
}
}

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

但我确实有以下想法:

  • 有两个构造函数。一种只有一个参数(用于永久 token ),另一种则具有所有三个参数(临时 token )。但是,我担心用户不会正确阅读文档,而是会使用永久 token 构造函数作为临时 token 。
  • 有两个不同的工厂方法而不是构造函数。这些工厂方法将被明确命名,因此用户使用错误方法的机会会很小。此外,用户不会被迫显式传入 null。

我认为第二个想法可能是最好的方法。例如,我想不出任何 Java API 需要我们传递 null,这可能暗示我粘贴的代码是一个坏主意。此外,Java 大量使用工厂方法,因此对于我的库的用户来说这不会是一个陌生的模式。

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

最佳答案

我更愿意将永久和临时 token 行为封装到各自的域中,以便您库的任何用户都清楚地知道正在实例化哪种 token

我认为建议的类(class):

/**
* 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;
}
}

永久 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;
}
}

临时 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;
}
}

现在,您的库的用户清楚地知道他/她想要实例化和使用哪种 token 。

P.S. - I guess you would be able to keep better names for your domains and you as deep into the business for your library.

关于java - 作为库作者,期​​望用户根据情况将 null 传递给方法参数是不是很糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55188133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com