用于存储简单数据的“public static”和“private static”之间的区别。什么是更好的?

时间:2017-02-11 19:26:32

标签: java

什么是更好的解决方案?

我在考虑这个问题,实际上性能更好,哪个更“正确”?

public static List<String> globalUseVariable;

private static List<String> globalUseVariable;
public static List<String> getGlobalUseVariable() {
    return globalUseVariable;
}

我认为第二个是因为封装规则?

3 个答案:

答案 0 :(得分:4)

简单地说:

  • 首先避免静态
  • 避免暴露内部状态

拥有公共可写字段几乎是不可行的。如果允许多个组件更新该数据,则会导致直接的硬连接。而且这也意味着你可以(很可能)说'再见'&#34;线程安全。即使你认为&#34;我今天只会那个字段&#34 ;;也许你会在几周内忘记这一点。或者你团队中的其他人错过了这一部分。所以

因此,如果您有良好的理由将某些数据提供给&#34; public&#34 ;;然后至少使用一个getter方法;因为这允许(稍后)改变。或者它允许简单的增强,例如返回内部状态的复制/克隆(以防止&#34;外部人员&#34;稍后操纵该内部状态)。

两种解决方法 static

  1. 如果你真的需要全球状态,或者其他什么东西可以胜任这项工作,那就要长时间地思考
  2. 如果您需要全局状态,则:A)创建一个接口,表示您想要提供的服务B)创建该接口的实现作为&#34; normal&#34; C)然后使用单例(例如枚举)来实现该接口[现在单例枚举可以将其工作委托给该impl类]
  3. 通过遵循方法2,您可以获得一些能够提供相同功能的东西(您拥有所有代码都可以使用的&#34;全局&#34;);但你让事情更加分离;最重要的是:你可以在各地进行合理的单元测试。

    静态通常是一个杀手&#34;进行合理的单位测试。

答案 1 :(得分:1)

建议使用getter,因为您可能希望在不更改API的情况下对类进行更改,或者在返回列表之前决定是否应执行某种转换。看看this answer regarding a similar situation。在我看来,同样的原则通常适用于静态字段,实际上没有理由对它们进行例外处理。 This question也涉及同一主题。我认为那里列出的原因同样适用于静态字段,并且完全合理。

一般情况下,如果你公开了一些内容,你就会创建一个公共API,并且应该保证不会发生变化,以免后期出现重大问题(如果要创建公共库,则必须进行更改)是向后兼容的。)

另外,使用getter和setter可以确保您编写的代码是线程安全的,如其他答案和链接的问题所述。当您公开公共字段时,您无法对此做任何事情。

答案 2 :(得分:1)

  

更多&#34;正确&#34;?

正如你的代码所代表的那样,我同意。将List标记为private,然后在方法中返回对同一List的引用,您无法获得任何好处。您无法调用此封装,因为无论您在方法中添加什么逻辑,您都会将List引用返回给调用者以进行修改。如果你想真正遵守封装,你可以做的最少就是让你的方法返回一个不可修改的集合(使用Collections.unmodifiableList)。

如果您希望列表为public,则可以将其标记为final,以便您班外的代码无法尝试YourClass.globalUseVariable=null之类的代码并破坏任何代码使用List