2016-08-08 59 views
3

为什么要为不可变类型声明static final变量为private声明私有静态最终变量的原因

在任何情况下是否可能对其声明public有任何伤害?

+5

仅仅因为这个字段是final的,并不意味着它引用的对象是不可变的,所以你可能仍然需要封装它。 – Andreas

+1

记录器是一个很好的例子,请参阅http://stackoverflow.com/questions/26241787/declaring-variable-final-and-static?rq=1 –

+2

或者只是任何不需要暴露的东西,以保持API小。 –

回答

3

因此,没有人可以从外部访问它并依赖该值,从而使您可以自由地改变它,而不会产生副作用(至少在声明它的类之外)。

+0

此答案不完整。 @ A4L给出了一个更完整的答案。 –

0

将变量保持在适当的范围内,这是最好的OOP练习。一个例子是一个全局静态的最终整数,用于在类中执行一些计算。暴露(公开)不仅会造成问题,还会造成混乱。

说你有,你需要知道圆周率的值类:

public class MyClass { 
    private static final double PI = 3.14159; 

    //functions performing calculations with value of PI 
} 

圆周率的值只需要内MyClass,所以把它留给被暴露是没有意义的 - 与所有的计算变量在MyClass之内完成。如果您再次需要它来执行计算,则应该在保持代码组织的类的类中完成。

+0

_暴露(公开)不仅可能会导致问题,而且还会造成混淆。请详细了解这一点。这是答案中有趣的部分。 –

+0

@SotiriosDelimanolis当然可以!没有意识到我不得不更详细地讨论,但我很乐意。 –

3

有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); 
    } 
} 

你不想让任何人操纵你的内部数据。

+0

我认为你的例子与你的答案不一致。 'list'没有真正的保护,可以修改。你可以防止它,如果生成列表将返回'Collections.unmodifiableList(Arrays.asList(“A”,“B”,“C”));' – user902383

+0

@ user902383这就是为什么的例子,即表明它不是因为这个问题是关于'private static final'的问题,如果这个列表是公开的或者是受保护的,那么它肯定会被一个不可修改的集合保护,就像你在你的评论或者副本中指出的那样。 – A4L

+0

在你的列表声明中使用什么关键字并不重要,如果提供的实现将是'ArrayList',它的内容可能会改变。 – user902383

-2

静态修饰符与最终修饰符一起也用于定义常量。最终修饰符表示该字段的值不能更改。

https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

如果声明公共静态最终变量,该变量就能够看出来的网站它的类。如果有人试图改变其他类中的值,它可能会在编译时造成潜在的错误。

如果声明静态final变量为private,则它隐藏在其他类中。所以你可以避免这样的错误。