ElaBosak233 / Valkyrie

一个面向中文社区的 Bukkit / Spigot 插件开发教程
https://valkyrie.ela.ac.cn
MIT License
27 stars 3 forks source link

配置文件 #16

Closed CaveNightingale closed 4 years ago

CaveNightingale commented 4 years ago

https://valkyrie.ela.ac.cn/#/./source/Part03/3.4-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6?id=%e5%ba%8f%e5%88%97%e5%8c%96%e8%87%aa%e5%ae%9a%e4%b9%89%e5%af%b9%e8%b1%a1

public static Operator deserialize(Map<String, Object> map) {
    String name;
    Integer level;
    if (map.get("name") != null) {
        name = (String) map.get("name");
    } else {
        name = null;
    }
    if (map.get("level") != null) {
        level = (Integer) map.get("level");
    } else {
        level = null;
    }
    return new Operator(name, level);
}

上面这个函数和下面这个函数没有任何区别,因为你判断完空指针之后又把它name和level赋值为空,这和直接保留空指针没有区别 注意上面这段函数执行4次get操作,下面这段函数只执行2次get操作,耗时更低 并且下面这个函数长度远远小于上面这个,可读性更强

public static Operator deserialize(Map<String, Object> map) {
    return new Operator((String) map.get("name"), (Integer)map.get("level"));
}
CaveNightingale commented 4 years ago

更何况你这里没有考虑ClassCastException的问题,如果考虑的话代码可以改成

public static Operator deserialize(Map<String, Object> map) {
    Object name = map.get("name"), level = map.get("level");
    return new Operator(name instanceof String ? (String)name : null, level instanceof Integer ? (Integer)level : null);
}
ElaBosak233 commented 4 years ago

转换异常我暂时没有考虑过会不会发生,但是上面的简便方法我应该已经在教程中提到过了

?> **更简便的方法** 如果你看过 **Bukkit** 的 **Javadoc**,你可以直接使用 `getConfig().getInt(key, 0)`,这个语句将直接判断 `key` 下是否有值,若没有,则写入默认值 `0`,其实,你如果直接写 `getConfig().getInt(key)`,即使 `key` 下没有任何值,也不会出问题,因为它本身就默认是 `0`,但注意,这些是 **Bukkit** 自动处理过的!

教程原本我更加注重逻辑,并没有考虑过简便方法,但是我已经将简便的代码添加进教程了

?> **更简便的方法** 如果你看过 **Bukkit** 的 **Javadoc**,你可以直接使用 `getConfig().getInt(key, 0)`,这个语句将直接判断 `key` 下是否有值,若没有,则写入默认值 `0`,其实,你如果直接写 `getConfig().getInt(key)`,即使 `key` 下没有任何值,也不会出问题,因为它本身就默认是 `0`,但注意,这些是 **Bukkit** 自动处理过的!以下是简便的版本

```java
public static Operator deserialize(Map<String, Object> map) {
    return new Operator((String) map.get("name"), (Integer)map.get("level"));
}
CaveNightingale commented 4 years ago

重点是你这里的空检查完全多余 因为你检查完map.get("name")为空之后又给name赋了空 那你这里空检查意义何在?

CaveNightingale commented 4 years ago

这就跟

if(x == 0) {
    x = 0;
}

一样没有逻辑

ElaBosak233 commented 4 years ago

好的,已修改