当前位置: 首页 > 知识库问答 >
问题:

存储简单数据的“公共静态”和“私有静态”的区别。什么比较好?[重复]

宋晋
2023-03-14

什么是更好的解决方案?

我在想,什么是性能上更好,或者哪个更“正确”?

public static List<String> globalUseVariable;

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

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

共有3个答案

闻人博
2023-03-14

哪个更「正确」?

按照你的准则,我都不同意。将列表标记为私有,然后在一个方法中返回对同一列表的引用,您将一无所获。您不能调用此封装,因为无论您在方法中添加什么逻辑,您都会将<code>列表</code>引用返回给调用方,以便调用方可以随意修改。如果要真正遵守封装,至少可以要求方法返回不可修改的集合(使用Collections.unmodifiableList)。

如果您希望您的列表是< code>public,您至少可以将它标记为< code>final,这样您的类之外的代码就不能尝试类似于< code > your class . global use variable = null 的操作,也不能破坏任何使用< code>List的代码。

慎兴业
2023-03-14

建议使用 getters,因为您可能希望在不更改 API 的情况下对类进行更改,或者您将决定在返回列表之前执行某种转换。看看这个关于类似情况的答案。在我看来,同样的原则通常适用于静态场,实际上没有理由为它们破例。这个问题也触及了同一个话题。我认为这里概述的原因也适用于静态场,并且是完全合理的。

一般来说,如果你把某个东西变成公共的,你就创建了一个公共的API,并且应该保证它不太可能为了避免以后的大麻烦而改变(如果你正在创建一个公共库并且必须是向后兼容的,那么改变甚至是不可能的)。

此外,通过使用getter和setter,您可以确保编写的代码是线程安全的,如其他答案和链接问题中所述。当您公开公共字段时,您对此无能为力。

贝礼骞
2023-03-14

简单来说:

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

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

因此,如果您有充分的理由向“公众”提供一些数据;然后至少使用getter方法;因为这允许(以后)更改。或者它允许简单的增强功能,例如返回内部状态的副本/克隆(以防止“局外人”以后操纵该内部状态)。

绕过静电的两种方法:

  1. 如果你真的需要一个全球性的国家,或者其他什么可以完成这项工作,那就好好想想。
  2. 如果您需要全局状态,那么:A)创建一个表示您要提供的服务的接口B)创建该接口的实现作为“普通”类C)然后使用一个实现该接口的单例(例如枚举)[现在单例枚举可以将其工作委托给该impl类]

通过遵循方法2,您可以获得具有相同功能的东西(您有一个所有代码都可以使用的“全局”东西);但是你让事情更加解耦;最重要的是:您可以在任何地方进行合理的单元测试。

静态通常是合理单元测试的“杀手锏”。

 类似资料:
  • 问题内容: 和之间有什么区别? 例如 : 要么 问题答案: 尽管您 确实 希望遵守约定,但在功能上没有什么区别(字节码将 完全相同 ),请访问JLS-8.3.1。场修饰符: __ 这将是奇怪的,看.. 我也建议您访问checkstyle。 编辑: 从同一页面链接到该部分: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls

  • 问题内容: 此Java程序包含一个静态变量。但是我无法理解公共静态变量和私有静态变量之间的区别。 问题答案: 公共变量可在代码中的 任何 位置访问- 私有变量仅可在类本身内部访问。在这种情况下,您可以在类中使用它,所以很好。 请注意,静态变量是完全独立的问题-方法和类具有与变量相同的可访问性。 还有其他级别的访问权限- 和默认的“包”访问权限(无法明确指定)。有关更多详细信息,请参见Java语言规

  • 这个java程序包含一个静态变量。但是我不明白公共和私有静态变量之间的区别。

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 本文向大家介绍静态和动态多态性有什么区别?,包括了静态和动态多态性有什么区别?的使用技巧和注意事项,需要的朋友参考一下 多态是对象采取多种形式的能力。当使用父类引用来引用子类对象时,会在OOP中最常见地使用多态。被子类覆盖的方法称为运行时多态。JVM确定要在运行时而不是编译时执行的方法。在参数不同的同一类中,方法重载是静态多态的一个示例,编译器在编译时就知道要执行哪种方法。