gpt4 book ai didi

java - 在 Java 中使抽象方法参数最终化

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:47:41 24 4
gpt4 key购买 nike

我有一个带有抽象方法的抽象类,我希望其参数是final - 也就是说,我不想让抽象类和方法的实现重新分配参数.

编辑:这样做的动机不是不变性本身,而是更多地与对象的设计有关。 (事实上​​ ,在我的用例中,参数是集合,它将在抽象方法的实现中发生变化。)相反,我想与任何实现我的抽象类/方法的人交流,这些变量不应重新分配。我知道我可以通过 java-doc 传达这一点,但我正在寻找更具契约性的东西 - 他们必须遵循,而不仅仅是被引导遵循。

在非抽象方法中,我可以使用 final 关键字来做到这一点 - 例如:

public class MyClazz {
public void doSomething(final int finalParameter){
finalParameter++; // compile error - cannot assign a value to final variable
}
}

但是,如果我在抽象方法中使用 final 关键字,这不构成契约的一部分——也就是说,抽象方法的实现不需要 final关键字,参数可以重新赋值:

public abstract class MyAbstractClazz {
public abstract void doSomething(final int finalVariable);
}

public class MyExtendedClazz extends MyAbstractClazz {
@Override
public void doSomething(int finalVariable) { // does not require final keyword
finalVariable++; // so the variable is modifiable
}
}

正如对此 SO Question 的回答中所指出的, final 关键字不构成方法签名的一部分,这就是抽象类的实现不需要它的原因。

那么,有两个问题:

  1. 为什么 final 关键字不是方法签名的一部分?我明白这不是但我想知道是否有特殊原因导致它不是。

  2. 鉴于 final 关键字不是方法签名的一部分,是否有其他方法可以使抽象方法中的参数不可分配?

其他研究:

  • SO question涉及同一问题,但我的两个问题都没有。事实上,第二个问题是明确提出的,但没有得到答案。

  • 很多关于 final 关键字的问题/博客等请引用 "the final word" .但是,关于这个问题,相关评论如下(虽然有用,但没有解决我的两个问题):

Note that final parameters are not considered part of the method signature, and are ignored by the compiler when resolving method calls. Parameters can be declared final (or not) with no influence on how the method is overriden.

最佳答案

I have an abstract class with an abstract method, the parameters for which I want to be final - that is, I do not want to allow implementations of the abstract class & method to reassign the parameter.

为什么不呢?这是一个实现细节。调用代码无法观察到它,因此抽象方法没有理由指定它。这就是为什么它也不是方法签名的一部分 - 就像 synchronized 不是一样。

一个方法应该实现其文档化的契约 - 但它如何选择这样做取决于它。由于 Java 始终使用按值传递,因此契约(Contract)无法说明任何关于参数最终性的有用信息。

关于java - 在 Java 中使抽象方法参数最终化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17719892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com