代码之家  ›  专栏  ›  技术社区  ›  Subodh Joshi

是否强制实用程序类应该是final和私有构造函数?

  •  17
  • Subodh Joshi  · 技术社区  · 9 年前

    通过创建私有构造函数,我们可以避免从外部任何地方实例化类。通过使类成为最终类,其他类都不能扩展它。为什么Util类需要 private 构造函数和 final

    4 回复  |  直到 9 年前
        1
  •  18
  •   Panther    9 年前

    从功能角度、java复杂性或运行时角度来看,这不是一项任务。然而,它的编码标准被更广泛的社区所接受。甚至很多静态代码审查工具,如 checkstyle 许多其他人检查此类课程是否遵守了这一规定。

    为什么遵循这一惯例,在其他答案中已经解释过,甚至OP也涵盖了这一点。

    我想进一步解释一下,大多数实用程序类都具有独立于对象实例的方法/函数。这些是一种聚合函数。因为它们只依赖于返回值的参数,而与实用程序类的类变量无关。因此,这些函数/方法大多保持静态。因此,实用程序类是所有静态方法的理想类。 因此,任何调用这些方法的程序员都不需要实例化这个类。然而,一些机器人程序员(可能没有太多经验或兴趣)会倾向于在调用其方法之前创建他们认为需要的对象。为了避免创建对象,我们有三个选项:-

    1. 继续教育人们不要实例化它 。(任何理智的人都不能继续这样做。)
    2. 将类标记为抽象类:- 现在机器人程序员也不会创建对象。然而,审查者和更广泛的java社区会认为,标记抽象意味着你希望有人扩展它。所以,这也是一个不好的选择。
    3. 私有构造函数:- Protected将再次允许子类创建对象。

    现在,如果有人想为这些实用程序类添加一些功能的新方法,他不需要扩展它,他可以添加新方法,因为每个方法都是独立的,而且不可能破坏其他功能。因此,无需重写它。而且你也不打算灌输,所以需要对它进行子类化。最好标记为最终。

    总之,创建实用程序类的对象没有意义。因此,构造函数应该是私有的。你永远不想改写它,所以把它标记为最终。

        2
  •  9
  •   Marko Topolnik    9 年前

    这不是必要的,但很方便。实用程序类只是相关函数的命名空间持有者,并不意味着要实例化或子类化。因此,防止实例化和扩展会向类的用户发送正确的消息。

        3
  •  0
  •   Recurse    9 年前

    Java语言和Java运行时之间有一个重要的区别。

    当java类被编译为字节码时,没有访问限制的概念, public , package , protected , private 是等效的。始终可以通过反射或字节码操作调用 私有的 构造函数,因此jvm不能依赖该功能。

    final 另一方面,它是一种持续到字节码的东西,javac可以使用它提供的保证来生成更高效的字节码,jvm可以使用它来生成更有效的机器指令。

    大多数这样启用的优化不再相关,因为jvm现在将相同的优化应用于所有在运行时为单态的类,而这些总是最重要的。

        4
  •  -1
  •   Anselmo Battisti    9 年前

    默认情况下,此类类通常用于聚合执行不同操作的函数。在这种情况下,我们不需要创建新对象