Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';t可选用于实例变量?_Java_Scala_Optional - Fatal编程技术网

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中创建带有
可选
字段的类的最简单方法。从某种意义上说,这种语言鼓励您编写这样的代码

另一方面,在