Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.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 为什么在创建不可变类时,字段被声明为私有?_Java_Immutability_Private_Final - Fatal编程技术网

Java 为什么在创建不可变类时,字段被声明为私有?

Java 为什么在创建不可变类时,字段被声明为私有?,java,immutability,private,final,Java,Immutability,Private,Final,在创建不可变类时,所有字段都声明为final,因此不能修改它们的值。这没关系,但是为什么我们还要将它们声明为private呢?如果该字段是对可变对象的引用,将其设置为final将防止引用反弹到其他对象。但是,仍然可以修改该对象,实际上是绕过了包含对象的不变性 为了防止出现这种情况,您可以将字段设置为私有(如果他们看不到,就不能修改) 例如: public class Order { public final List<OrderLine> order_lines = ...; }

在创建不可变类时,所有字段都声明为final,因此不能修改它们的值。这没关系,但是为什么我们还要将它们声明为private呢?

如果该字段是对可变对象的引用,将其设置为final将防止引用反弹到其他对象。但是,仍然可以修改该对象,实际上是绕过了包含对象的不变性

为了防止出现这种情况,您可以将字段设置为私有(如果他们看不到,就不能修改)

例如:

public class Order {
  public final List<OrderLine> order_lines = ...;
}
公共类秩序{
公共最终列表顺序_行=。。。;
}

在这里,任何人都可以通过添加/删除/修改订单行来修改订单,即使
order\u lines
final

一个不可变的对象在创建后不能更改,但这并不意味着它必须有一个简单的实现,应该导出到所有客户端。以
字符串
类型为例,它使用了大量疯狂的幕后优化,以最大限度地提高常见情况下的效率(例如,在使用
子字符串
时共享一个备份数组)。通过隐藏类的所有字段,该实现可以尝试利用节省时间或空间的优化,并通过公共接口协调对存储数据的访问。如果这些字段是公开的,那么在事后更改实现将是困难的(如果不是不可能的话)

换句话说,不变性并不意味着封装,反之亦然

希望这有帮助

public class Person{
   public Date birthDate = new Date(615666470l); 
}
然后任何人都可以从外面更新生日

Person porfiriopartida = new Person();
porfiriopartida.birthDate=new Date(931199270); 
如果您提供了一个具有所需起始属性的构造函数,那么您只允许获取对该值的引用


还请记住不要在get方法中返回实际对象(至少那些方法本身是不可变的).

你知道什么是
private
visibility吗?@Sotirios Delimanolis如果任何成员是private的,那么它就不能在类外访问封装原则要求你尽可能少地暴露于外部世界。如果字段是可变的,它就不是一个很好的不可变类,是吗?@HotLicks OP问的是为什么它们是
私有的
,而不是为什么它们不是
最终的
。作为
final
使它们不可更改,而不是
私有
。我认为问题在于为什么它们是
私有
,而不是
final
“如果它们看不见,就不能修改它”-不是true@SargeBorsch:精心设计。@NPE反射可以破坏
私有
。你对反射无能为力,如果我们不得不整天说“不可变的,不算反射”,而不是一个词“不可变的”,我们就没有时间做任何事情了。我是编程新手……所以我无法理解你的解释“隐藏类的所有字段,实现可以尝试利用节省时间或空间的优化”请您通过另一个基本示例进行解释:(