Java - 没有类构造函数是不好的实践吗?

14

我想创建一个帮助类来处理格式化的内容(比如删除标点符号、转换类型以及重新格式化名称等)。这个类似乎不需要任何字段 - 它的唯一目的是将需要转换的东西传递给它,然后返回格式化后的结果。如果没有构造函数是否会不好?如果不好,我的构造函数应该做什么?我看了这个链接,发现它描述的类缺少构造函数。

7个回答

41
是的,因为除非您指定任何构造函数,否则Java编译器将给您一个具有与类本身相同可见性的构造函数。
假设您的所有方法都是静态的-这似乎很可能,除非您想要多态性-您应该使您的类final 并给它一个private 构造函数,以便其他开发人员不会意外地创建一个无用的类实例。在考虑API时,每当我可以去除开发人员做某些愚蠢事情的能力时,我都会这样做:)
所以就像这样:
public final class Helpers {
    private Helpers() {
    }

    public static String formatDate(Date date) {
        // etc
    }
}

请注意,如果将多态性排除在外,您也将消除在测试等方面更改此行为的可能性。这可能是可以接受的 - 我不相信“永远不使用静态变量” - 但值得考虑。


谢谢!在我非常短暂的Java经验中,我从未见过私有构造函数,所以这很有趣和有用。 - false_azure
不确定是否有人会看到这个,但我有另一个问题。我实现了这个解决方案,现在,在我的代码的某个地方,需要一个将员工数据格式化为字符串输出的方法(稍后发送到stdout)。如果它只可能与Employee对象一起使用,而不是具有通用性,那么将其放入此实用程序类中是否有意义? - false_azure
@FalseAzure:如果您有另一个问题,应该将其作为另一个问题发布。不要只将其添加为现有问题或答案的评论。 - Jon Skeet

6
任何具有所有方法不需要或不需要任何状态的类都可以通过将构造函数设置为私有来减少其可见性。

例如Java中的java.lang.Math类。

由于java.lang.Math具有执行与您的类相似工作的所有静态方法,因此它们已将构造函数声明为private,以便没有人会意外创建该类的实例。

    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}

3

这并不是一个坏的做法,但你给出的例子没有任何成员变量可以在对象上下文中使用。在这种情况下,最好使用静态方法,因为这样就不需要分配内存来创建类的对象,然后再调用方法。


1
编译器会为您生成一个默认构造函数(没有参数)。如果您的类没有状态,也不扩展需要初始化的类,则可以让它不声明显式构造函数。

1

如果您的类中没有实例变量,那么不需要编写构造函数是可以的!

构造函数的作用是初始化实例变量!

即使您跳过了构造函数,编译器也会自动插入默认构造函数,这是合理的!!


0
你不必为你的类提供任何构造函数,但是在这样做时必须小心。编译器会自动为没有构造函数的任何类提供一个无参默认构造函数。这个默认构造函数将调用超类的无参构造函数。在这种情况下,如果超类没有无参构造函数,编译器会报错,因此您必须验证它是否存在。如果您的类没有显式超类,则具有隐式超类Object,它具有一个无参构造函数。 Java官方文档:为您的类提供构造函数

-2
通常情况下,将构造函数定义在类中是一个很好的编程实践,尽管每个类都有一个默认构造函数。
但是如果您没有任何特殊需求需要使用重载的构造函数或创建任何单例模式,那么可以删除构造函数。
如果在您的情况下正在使用静态方法,则您也没有必要定义构造函数,因为您不需要此类的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接