Java类变量安全优化:哪种修改可提升Foo类的安全性?
Java类Foo的安全性优化问题
原Foo类源码
public class Foo { public static String ALPHA = "alpha"; protected String beta = "beta"; private final String delta; public Foo(String d) { delta = ALPHA + d; } public String Foo() { return beta; } }
问题
请问哪种修改能提升Foo类的安全性?原因是什么?该问题涉及可见性修饰符及常量、变量的合理使用。
可选修改方案
- 选项A:
protected final String beta = "beta"; - 选项B:
private String delta; - 选项C:
public static final String ALPHA = "alpha"; - 选项D:
public String beta = "beta";
正确选项及原因
正确选项是C,原因如下:
原代码中public static String ALPHA是一个可被全局修改的静态变量,任何外部类都能直接通过Foo.ALPHA = "非法值";篡改它的内容。一旦ALPHA被修改,所有依赖它的逻辑(比如构造方法里delta = ALPHA + d的赋值逻辑)都会产生不可预期的结果,严重破坏类的稳定性与安全性。
给ALPHA添加final修饰后,它变成了不可修改的公共静态常量:
static保证它是类级别的常量,无需为每个实例重复创建final确保它的值在初始化后无法被任何代码修改,外部只能读取不能篡改public的访问权限如果是业务需求(比如需要对外暴露这个固定常量),搭配final就完全没有安全风险
其他选项分析
- 选项A:将beta改为
protected final虽然让beta不可修改,但protected权限仍允许子类和同包类访问,且原beta的可修改风险远小于ALPHA的全局篡改风险,安全性提升有限,甚至可能违背beta原本的设计意图(比如子类可能需要修改beta)。 - 选项B:去掉delta的
final修饰,会让原本不可变的私有变量变成可修改状态,破坏了delta的不可变性,容易导致类内部状态不一致,反而降低安全性。 - 选项D:将beta的权限扩大为public,会让任何外部类都能直接修改beta,明显降低了封装性与安全性。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

