这里的“security”并不是指“抵御攻击”的意思;更像是“不易犯错误”。
我更喜欢用“安全性”,因为我认为它更像是预防事故,而不是恶意行为。
Java中的final
关键字不用于这种类型的安全性。它不能替代通常需要使用加密解决方案的内容。
在这些讨论中,“安全”通常是指一个安全的对象模型的概念 - 即一个对象模型,消费者无法将其用于原类的意外目的。
final
方法,消费者就无法覆盖类的行为并改变如何封装状态。一个类可以公开其状态(例如通过公共字段),而没有final
关键字则无法保护该状态的完整性。 - Andrew Hare我不确定在我的系统中是否应该依赖语言结构来增加安全性。
我认为将字段设置为final并不能增加对恶意攻击的安全性(更可能是针对错误和线程问题)。唯一的“真正形式”安全性是,如果您有一个final常量字段,它可能会在编译时被内联化,因此在运行时更改其值不会产生影响。
我听说过final和安全性更多是在继承的上下文中。通过使类final,您可以防止某人对其进行子类化并触及或覆盖其受保护成员,但再次,我更多地使用它来避免错误而不是预防威胁。
安全防范什么?
在移动代码方面(可以在系统之间移动的代码 - applet、midlet、WebStart、RMI/JINI等),这非常重要。应用于类和部分可访问方法,它可以防止恶意实现。同样的,对于可访问字段,特别是静态字段也是如此。如果您要编写可能成为库一部分的代码,则需要高度警觉。
对于典型的网络或桌面应用程序代码而言,这远不及那么重要。然而,如果缺少字段上的它,代码会变得更难阅读,并且表明程序员混乱。这样的代码由于编写不良而不太可能是安全的。
它并不会让你的代码更安全,它更多是为了线程安全而设计的。如果一个变量被标记为final,在对象创建时必须给它赋值。在对象创建后,该变量不能再指向另一个值。
这种行为允许你推理出对象的状态,并在多个线程同时访问它时做出某些假设。
我想,当有人说final
会使你的代码更安全时,他们的意思是它可以防止未来的开发者修改不应被修改的值,或继承不应被扩展的类(从而导致不可预测的结果)。这与身份验证没有直接关系。
我相信final关键字在设计上的作用和类声明中的访问修饰符类似,是一种表达和强制执行设计的方式。
“final”关键字确实有一些安全方面的影响。假设您正在设计一个安全系统,该系统具有一个服务,如果并且仅当字符串有效时才执行某些操作。您可能会编写:
public void doSomethingUseful(String argument) {
checkValidity(argument);
/* prepare to do something useful... preparation takes a bit of time! */
reallyDoTheUsefulTask(argument);
}
所以,final确实有一些安全考虑因素。
final关键字通常用于保持不可变性。将final用于类或方法是为了防止方法之间的链接被破坏。例如,假设类X的某个方法的实现假定方法M会以某种方式运行。声明X或M为final将防止派生类重新定义M,从而导致X的行为不正确。它可以保护对象和方法免受操纵。但是对于加密目的,使用final关键字并非解决方案。