什么是更好的解决方案?
我在考虑这个问题,实际上性能更好,哪个更“正确”?
public static List<String> globalUseVariable;
或
private static List<String> globalUseVariable;
public static List<String> getGlobalUseVariable() {
return globalUseVariable;
}
我认为第二个是因为封装规则?
答案 0 :(得分:4)
简单地说:
拥有公共可写字段几乎是不可行的。如果允许多个组件更新该数据,则会导致直接的硬连接。而且这也意味着你可以(很可能)说'再见'&#34;线程安全。即使你认为&#34;我今天只会读那个字段&#34 ;;也许你会在几周内忘记这一点。或者你团队中的其他人错过了这一部分。所以
因此,如果您有良好的理由将某些数据提供给&#34; public&#34 ;;然后至少使用一个getter方法;因为这允许(稍后)改变。或者它允许简单的增强,例如返回内部状态的复制/克隆(以防止&#34;外部人员&#34;稍后操纵该内部状态)。
两种解决方法 static :
通过遵循方法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
。