让某 method 明确声明: 我不接受 null 参数, 传了 null , 我马上崩溃 !
并且, 该抛错在编译阶段抛出, 不要跑到运行时去
PHPz2017-04-18 10:36:33
Java の型システムはそれをサポートしておらず、プラグイン (Checker Framework) を通じてのみ実装できます。注釈を追加するには、コンパイル中にプラグインを指定します。
上記はコンパイラによる null の検出を実装しています。null が渡された場合のクラッシュについては、プラグインを通じて null チェック コードを挿入することで実現できます。
巴扎黑2017-04-18 10:36:33
良い質問です。私は通常、関数の実装方法にのみ注目しますが、この質問のように、なぜ Java がこの方法で関数を実装しないのかについてはあまり考えていませんでした。 Java 構文がサポートされていれば、開発効率は少なくとも数倍向上するのではないかと、さまざまな想像が湧き起こりました。しかし、よく考えてみると、何かが間違っているように思えます。
Java がそのような構文をサポートしていると仮定して、注釈 @NotNull
を使用して、パラメーターが空ではないことを示します@NotNull
标识参数不为空
一个这样场景:用户登录成功后,更新用户的登录时间和ip。
用户数据有:
name | password | lasttime | ip |
---|---|---|---|
aaa | 123456 | 2017-01-09 | 192.168.1.1 |
bbb | 123456 | 2017-01-08 | 192.168.1.1 |
更新用户信息伪代码:
public void updateAccount(@NotNull Account account) {
// 因为肯定不为空,可以放心大胆的更新Account的最新登录时间、ip
}
@NotNull
表示参数:account
不能为空,这里没什么问题。
获取用户信息验证登录伪代码:
public Account login(String name) {
// 1、连接数据库
// 2、根据用户名获取Account
// 3、验证用户信息
// 4、验证成功返回Account信息,验证失败返回null
}
我们只是参数不能为空,并不让返回值不为空,这样也没什么问题。
主逻辑判断伪代码:
public static void main(String[] args) {
AccountService service = new AccountService();
// aaa登录
Account account = service.login("aaa","123456");
service.updateAccount(account);
// bbb登录
Account account = service.login("bbb","123456");
service.updateAccount(account);
// ccc登录
Account account = service.login("ccc","123456");
service.updateAccount(account);
}
那么问题来了,account参数到底能不能传入service.updateAccount()
方法,编译能不能通过?从数据库中读取的Accoount
对象本来就是个模凌两可对象,有可能代表某个人,也有可能是null
<テーブル> <頭>
@NotNull
は、パラメータ account
を空にすることはできないことを意味します。ここでは問題ありません。 ログイン疑似コードを検証するためのユーザー情報を取得します:
メインロジック判定疑似コード:
service.updateAccount()
メソッドに渡すことができ、コンパイルに成功できるかということです。データベースから読み取られた Account
オブジェクトは本質的にあいまいなオブジェクトであり、特定の個人を表す場合もあれば、null
である場合もあります。 その後、戻り値をnull以外にしますか?