Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Functional Interface - Fatal编程技术网

具有函数字段的Java类可以被认为是不可变的吗?

具有函数字段的Java类可以被认为是不可变的吗?,java,immutability,functional-interface,Java,Immutability,Functional Interface,如果我有一个带有函数字段的类,它是不可变的吗?例如: @Immutable private static final class DependentBigtablePath extends BigtablePath { private final BigtablePath delegate; private final Function<String, String> derivationFunction; private DependentBigtablePath( Bi

如果我有一个带有函数字段的类,它是不可变的吗?例如:

@Immutable
private static final class DependentBigtablePath extends BigtablePath {

 private final BigtablePath delegate;
 private final Function<String, String> derivationFunction;

 private DependentBigtablePath( BigtablePath delegate, Function<String, String> derivationFunction) {
  this.delegate = Preconditions.checkNotNull(delegate);
  this.derivationFunction =Preconditions.checkNotNull(derivationFunction);
 }  
  ...
}
@不可变
私有静态最终类DependentBigtablePath扩展了BigtablePath{
私有路径委托;
私有最终函数派生函数;
private DependentBigtablePath(BigtablePath委托,函数派生函数){
this.delegate=前提条件.checkNotNull(委托);
this.derivationFunction=前提条件.checkNotNull(derivationFunction);
}  
...
}

我们不知道函数实现类是否是不可变的,但这有关系吗?

对于“不可变”的实际定义:不,在不知道其所有字段是否也是不可变的情况下,您无法知道
DependentBigtablePath
是否是不可变的。这是一个显而易见的例子:

public class ClassThatWantsToBeImmutable {
  public final MutableClass a;

  //...constructor, etc.

  @Override
  public String toString() {
    return a.toString();
  }
}

如果
a
发生了变异,使得其
toString()
方法返回了不同的结果,那么想要成为可变的
类(引用
a
)的行为也会发生变化。

我不确定这是否取决于对不可变的解释,有人可能会说,对内部
函数
状态的更改不会修改函数本身(例如捕获的变量),但我认为从技术上讲,这并不会使类不可变。这取决于。。。guava的
@Immutable
解释说“所有引用字段都是不可变的要求确保了深度不可变,这意味着所有包含的状态也是不可变的[
函数
违反了这一点]。容器类中常见的一个较弱的属性是浅层不变性,它允许对象的某些字段指向可变对象。浅层不变性的一个例子是guava的
不可变列表
,它可能包含可变元素。“-那么您要实现哪一个呢?坏函数:
String[]state={'};函数f=in->in+状态[0];状态[0]=“oops”我同意,如果函数发生变化,因此任何使用它的方法都会给出不同的结果,那么对象是不可模拟的。我只需要想一想什么是不变的。