更新:下面的原始答案是在没有完全理解该问题的情况下编写的,因此不能直接解决该问题。:)尽管如此,对于希望了解final关键字的一般用法的人员来说,它必须是有益的。
关于这个问题,我想从下面引用我自己的评论。
我相信您不会被迫实施某个论点的终结性,让您自由决定是否应该 最终在自己的实现与否。
但是,是的,您可以final在接口中声明它却拥有它,这听起来很奇怪在实现中将其定为最终值。如果满足以下条件,那将更有意义:
一个。 final接口(抽象)方法参数不允许使用关键字(但是您可以在实现中使用它),或者
b。final在接口中声明参数将强制final在实现中声明该参数(但对于非最终声明则不强制)。
我可以想到方法签名可以具有final参数的两个原因:Bean和Objects(实际上,它们都是相同的原因,但是上下文略有不同。)
对象:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
// ^--- OUTPUT IS: Water Carrot Broccoli Chicken ChickenBroth
// We forgot to add cauliflower. It went into the wrong pot.
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
// ^--- Assignment allowed...
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
//cookingPot = new StringBuilder(cookingPot.toString());
// ^---- COMPILATION ERROR! It is final.
cookingPot.append("ChickenBroth ");
}
该final关键字确保我们不会意外地创建一个新的地方通过展示编译错误炒菜锅当我们试图这样做。这样可以确保将鸡汤添加到该addChicken方法获得的原始烹饪锅中。与此相比addVegetables,我们损失了花椰菜的地方是因为花椰菜将它添加到了新的本地烹饪锅中,而不是原来的锅中。
Beans:
与对象的概念相同(如上所示)。Bean本质上Object是Java中的。但是,bean(JavaBeans)在各种应用程序中用作存储和传递定义的相关数据集合的便捷方法。正如addVegetables可能通过创建一个新的烹饪锅StringBuilder并将其与花椰菜一起扔掉而使烹饪过程混乱一样,它也可以通过烹饪锅JavaBean来做同样的事情。
final由于本机类型已被复制,因此无论如何都不会对其进行任何处理。