回答
因此,没有人可以从外部访问它并依赖该值,从而使您可以自由地改变它,而不会产生副作用(至少在声明它的类之外)。
此答案不完整。 @ A4L给出了一个更完整的答案。 –
将变量保持在适当的范围内,这是最好的OOP练习。一个例子是一个全局静态的最终整数,用于在类中执行一些计算。暴露(公开)不仅会造成问题,还会造成混乱。
说你有,你需要知道圆周率的值类:
public class MyClass {
private static final double PI = 3.14159;
//functions performing calculations with value of PI
}
圆周率的值只需要内MyClass
,所以把它留给被暴露是没有意义的 - 与所有的计算变量在MyClass
之内完成。如果您再次需要它来执行计算,则应该在保持代码组织的类的类中完成。
_暴露(公开)不仅可能会导致问题,而且还会造成混淆。请详细了解这一点。这是答案中有趣的部分。 –
@SotiriosDelimanolis当然可以!没有意识到我不得不更详细地讨论,但我很乐意。 –
有serveral的原因...
隐私
保持实施细则,从客户端隐藏,用于内部使用例如常量只有与没有使用客户
安全
保护您的代码免受恶意客户端代码侵害,例如:
static class A
{
public final static List<String> list = buildList();
public static List<String> buildList()
{
ArrayList<String> list = new ArrayList<>();
list.addAll(Arrays.asList("A", "B", "C"));
return list;
}
}
static class B
{
public static void main(String[] args)
{
A.list.clear();
System.out.println(A.list);
}
}
你不想让任何人操纵你的内部数据。
我认为你的例子与你的答案不一致。 'list'没有真正的保护,可以修改。你可以防止它,如果生成列表将返回'Collections.unmodifiableList(Arrays.asList(“A”,“B”,“C”));' – user902383
@ user902383这就是为什么的例子,即表明它不是因为这个问题是关于'private static final'的问题,如果这个列表是公开的或者是受保护的,那么它肯定会被一个不可修改的集合保护,就像你在你的评论或者副本中指出的那样。 – A4L
在你的列表声明中使用什么关键字并不重要,如果提供的实现将是'ArrayList',它的内容可能会改变。 – user902383
静态修饰符与最终修饰符一起也用于定义常量。最终修饰符表示该字段的值不能更改。
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
如果声明公共静态最终变量,该变量就能够看出来的网站它的类。如果有人试图改变其他类中的值,它可能会在编译时造成潜在的错误。
如果声明静态final变量为private,则它隐藏在其他类中。所以你可以避免这样的错误。
- 1. 在C++的类中声明私有静态变量
- 2. 为什么变量应声明为静态和最终
- 3. enum中的私有静态最终变量
- 4. 在JavaScript中声明私有静态成员变量
- 5. 为什么不能在非静态块中声明静态最终变量?
- 6. 使用Powermock嘲弄静态私有最终变量?
- 7. 静态最终变量
- 8. 静态最终变量
- 9. 静态私有变量
- 10. 私有静态变量
- 11. 非静态私有变量
- 12. 声明静态私有数组成员
- 13. 不使用静态变量的原因?
- 14. 最终静态与非最终静态变量?
- 15. '公共静态最终'或'私人静态最终'与getter?
- 16. 是否有动态变量不是私有的原因?
- 17. 静态变量声明的时间
- 18. JAVA中的实例变量的公共静态最终声明接口
- 19. 失败修改私人最终静态变量无一例外
- 20. 静态变量正在重置,原因不明
- 21. 局部变量需要最终声明
- 22. 非最终静态变量的用例
- 23. .properties作为最终的静态变量
- 24. 声明全局静态变量
- 25. 声明静态变量在单
- 26. 声明和放置静态变量
- 27. 在函数中声明静态变量
- 28. 如何声明静态变量
- 29. ios - 如何声明静态变量?
- 30. 在主内部声明私有变量
仅仅因为这个字段是final的,并不意味着它引用的对象是不可变的,所以你可能仍然需要封装它。 – Andreas
记录器是一个很好的例子,请参阅http://stackoverflow.com/questions/26241787/declaring-variable-final-and-static?rq=1 –
或者只是任何不需要暴露的东西,以保持API小。 –