当前位置: 首页 > 面试题库 >

为什么公共静态最终数组是一个安全漏洞?

顾赞
2023-03-14
问题内容

有效的Java说:

//潜在的安全漏洞!

静态公共最终Thing [] VALUES = {…};

有人可以告诉我什么是安全漏洞吗?


问题答案:

声明static final public字段通常是类常量的标志。对于原始类型(int,double等)和不可变的类(例如字符串和),这是非常好的选择java.awt.Color。对于数组,问题在于,即使数组引用是恒定的,数组的元素仍然可以更改,并且因为它是一个字段,所以更改不受保护,不受控制并且通常是不受欢迎的。

为了解决这个问题,可以将数组字段的可见性限制为私有或程序包私有,因此在查找可疑修改时可以考虑使用较小的代码体。另外,通常更好的方法是一起删除数组,并使用“列表”或其他适当的集合类型。通过使用集合,您可以控制是否允许更新,因为所有更新都通过方法进行。您可以使用来包装您的收藏,以防止更新Collections.unmodifiableList()。但是请注意,即使集合是不可变的,您也必须确保存储在集合中的类型也是不可变的,否则会重新出现假定的常量的未经请求的更改的风险。



 类似资料:
  • 问题内容: 我一直想知道Java中的单例。按照惯例,单例设置如下: 最近,我切换到使用以下内容: 由于没有空检查,因此它更短,更快捷,而且打字对我来说比打字好。有什么理由不能使第二种方法成为主流呢? 问题答案: 第一个版本在第一次实际需要时创建实例,而第二个版本(较短的版本)在初始化类后立即运行构造函数 类或接口类型T将在以下任何一种首次出现之前立即初始化: T是一个类,并创建T的实例。 T是一个

  • 问题内容: [已更新,对更改感到抱歉,但现在是真正的问题] 对于getCanonicalPath()方法中的异常,我无法在其中包括try-catch- loop。我试图通过方法来解决问题,然后在其中声明值。问题是它是最终版本,我无法更改。因此,如何将startingPath作为“ public staticfinal”。 问题答案: 这个名字很好。您忘记声明类型了。 解决这个问题,您当然会意识到如

  • 问题内容: 和之间有什么区别? 例如 : 要么 问题答案: 尽管您 确实 希望遵守约定,但在功能上没有什么区别(字节码将 完全相同 ),请访问JLS-8.3.1。场修饰符: __ 这将是奇怪的,看.. 我也建议您访问checkstyle。 编辑: 从同一页面链接到该部分: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls

  • 问题内容: Java修饰符的合理顺序是什么? 抽象 最后 本机 私人的 受保护的 上市 静态的 严格的 已同步 短暂的 易挥发的 更新资料 我已将措辞从“ 建议” 更改为“ 合理” ,以使讨论是否平静,无论是否建议使用该命令。 问题答案: Java语言规范(而不是Java虚拟机规范)中提到了修饰符的 习惯 用法顺序,例如,对于类修饰符,您将找到以下定义(摘录): [....] 如果两个或更多个(不

  • 问题内容: 给定下面的Java代码,您可以在Ruby类中最接近地表示这两个变量吗?而且,在Ruby中是否可以像Java中那样区分和变量? 问题答案: Ruby中确实没有等效的构造。 但是,您似乎犯了一个经典的移植错误:您有一种使用语言A 的 解决方案 ,然后尝试将其翻译为语言B,这时您真正应该做的就是找出 问题 ,然后找出解决方法使用语言B。 我不能完全确定您要从那个小的代码段中解决什么问题,但是