PHP8 —— New String Helpers

新增了三个字符串函数,str_starts_with, str_ends_with, str_contains, PHP 的函数这么方便,很难想象竟然一直没有这几个。 str_starts_with 判断字符串是否以另一个字符串开头,在PHP7以及之前 $id = 'inv_abcdefgh'; $result = strpos($id, 'inv_') === 0; var_dump($result); // true PHP8 中可以直接这么写 $result = str_starts_with($id, 'inv_'); str_ends_with 判断字符串是否以另外一个字符串结尾,在 PHP7 及之前,比较麻烦,通常是这么写 $id = 'abcd_inv'; $result = strpos(strrev($id), strrev('_inv')) === 0; 或者 $result = substr($id, -1 * strlen('_inv')) === '_inv'; 或者上正则吧 $result = preg_match('/_inv$/', $id) === 1; 看起来都是比较麻烦的。PHP8 里面可以简化成下面这样了 $id = 'abcd_inv'; $result = str_ends_with($id, '_ind'); str_contains 字符串包含,PHP8 之前一般就是 strpos 来实现了 $url = 'https://example?for=bar'; $result = strpos($url, '?') !== FALSE; PHP8 就直接一点 $result = str_contains($url, '?');

Java学习笔记 —— 在 getter 和setter 中使用 Optional

Optional 的主要目的,是为了使用可为null的值,却不抛NullPointerException异常。 Optional类被有意设计为不可serializable,所以我们不应该用它来包装类的字段。

在getter和setter中使用 optional 的最佳方案是:把getter的返回值包装到 optional 中,setter 不要使用optional。 举个🌰:

public class Department {
    private  Manager boss;

    public Optional<Manage> getBoss() {
        return Optional.ofNullable(boss);
    }

    public void setBoss(Manager boss) {
        this.boss = boss;
    }
}

在Department类里面,boss 字段可以为空。如果我们把boss字段设为 Optional类型,那么 boss 就不能序列化了,这样 Department 也就不能序列化了。
因为字段可以为null,所以setter方法接受的参数没有必要用 Optinonal类型了,直接用 Manager就行;为了让用户明确知道boss字段可以为null,getter的返回值可以用Optional进行包装。
这种方法也有缺点是,JavaBeans是根据属性成对的定义getter和setter的。而这种方案违反了标准的模式,getter 和setter 不再对称了。所以有一些开发着认为 Optinonal 没有必要 通过getter 和 setter 暴露给用户,应该把它当作内部实现细节。

评论

此博客中的热门博文

D3js Data-binding basics

JavaScript 数据类型

Vue3新特性(1) —— Vite