Java 为什么不是';t可选用于实例变量?
我已经阅读了很多关于应该使用Java 为什么不是';t可选用于实例变量?,java,scala,optional,Java,Scala,Optional,我已经阅读了很多关于应该使用可选的案例 我读过的很多页面都说,Optional不应该用于私有实例变量,而应该由getter返回 我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到一个值可以为空,而不必检查文档以查看是否可以返回null 在Scala中,null从来没有被使用过,只是真正用于与Java的互操作性。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义 这里有一页提到它: 下面是示例代码 private final String addre
可选的案例
我读过的很多页面都说,Optional
不应该用于私有实例变量,而应该由getter返回
我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到一个值可以为空,而不必检查文档以查看是否可以返回null
在Scala中,null从来没有被使用过,只是真正用于与Java的互操作性。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义
这里有一页提到它:
下面是示例代码
private final String addressLine; // never null
private final String city; // never null
private final String postcode; // optional, thus may be null
// normal getters
public String getAddressLine() { return addressLine; }
public String getCity() { return city; }
// special getter for optional field
public Optional<String> getPostcode() {
return Optional.ofNullable(postcode);
}
private final String addressLine;//永不失效
私人城市;//永不失效
私有最终字符串邮政编码;//可选,因此可能为空
//普通吸气剂
公共字符串getAddressLine(){return addressLine;}
公共字符串getCity(){return city;}
//可选字段的特殊getter
公共可选getPostcode(){
返回可选。不可用(邮政编码);
}
我能看到的唯一优点是,如果您想序列化对象,现在就可以了,因为它没有在变量中存储可选内容
缺点是,在检查getter的返回类型之前,您不知道postcode可以为null。如果您对代码不熟悉,则可能会错过此添加扩展类,从而导致空指针异常
这里有一个关于Scala的选项的问题
为什么Java和Scala在如何使用可选性方面存在差异 在Scala中,与语言的API紧密集成
表示可选值。Option的实例可以是scala.Some的实例,也可以是object None。
使用scala.Option实例最惯用的方法是将其视为集合或monad,并使用map、flatMap、filter或foreach
从上面的引文可以看出,这里没有null
解释,因为它应该用作单子或集合
在Java中,用于将我们从NullPointerException情况中解救出来,方法是将其用作:
可以包含或不包含非空值的容器对象。如果存在值,isPresent()将返回true,get()将返回该值
一种编程语言,它通过使用非常清楚地向用户显示变量是否可以为null,并向您显示编译错误:
var a: String = "abc"
a = null // compilation error
var b: String? = "abc"
b = null // ok
print(b)
并非所有Java开发人员都同意您描述的方法。请检查这一点的创造者龙目
我想,在Java中使用Optional
的不同方法的原因是Java社区在Java8之前都没有它,所以大多数人习惯于null。一方面,许多新的API(如流中的findAny
)返回可选的,但仍然有许多标准库方法只返回null,因此您必须始终记住要么用可选的.ofNullable
包装函数调用,要么检查值是否为null
Optional
已添加到Java 8中,但不鼓励将其用作类字段,因为Optional
未实现Serializable
(许多框架或系统(如Akka、Spark、Kafka等)都使用Java的序列化作为默认序列化引擎)
另一方面,选项
与Scala标准库紧密结合。
据我所知,没有Scala的标准库API返回null,而是选项
,不建议在Scala代码中使用null。您甚至可以配置项目,使其在null为空时无法编译
选项
也是可序列化的
,其通常做法是将其用作可以为空的值的类字段
如果您想在Java代码中使用类似的方法,请查看Vavr。它是可序列化的,因此可以安全地用作字段,它还有两个子类None
和Some
(类似于Scala的选项
),因此可以用于Vavr的模式匹配:
Match(option).of(
Case($Some($()), "defined"),
Case($None(), "empty")
);
有一个位置是可选的,像Stream一样,是一个迭代的«事件»类,不值得在“真实”对象中用作字段
然后是不可序列化的缺点(可以解决)
然而,我的观点是,一些变量可能是可选的,基数为0和1。
正如列表也是有效的一样。对于列表
字段,趋势是(IMHO),最初不允许为空,但始终有一个(空)列表
在相同的编码样式中,可选
确保只使用安全访问,尤其是可以以链接样式映射:
Optional<TextField> t = ...
String s = t.map(t::getText).orElse("N/A");
Optional<String> u = t.map(t::getText);
t.ifPresent(s -> { ... });
可选t=。。。
字符串s=t.map(t::getText.orElse(“N/A”);
可选的u=t.map(t::getText);
t、 如果存在(s->{…});
尤其是ifPresent
确保了不会不间断地使用null
可选是一个有价值的规范。不将可选
用于实例变量的一个原因是可选
引用本身很容易为空。这违反了关于可选
的默示约定,即您不应创建或遇到对可选
的空
引用
class-Foo{
可选条;
}
Foo f=新的Foo();
如果(f.bar.isPresent()){//NullPointerException
...
}
这是在Java中创建带有可选
字段的类的最简单方法。从某种意义上说,这种语言鼓励您编写这样的代码
另一方面,在