13

我想创建一个处理格式的辅助类(即具有删除标点符号和类型之间转换的方法,以及重新格式化名称等)。这似乎不需要任何字段 - 它的唯一目的是让传递的东西转换并返回它们,重新格式化。省略构造函数是不好的做法吗?如果是这样,我的构造函数应该做什么?我正在查看此链接,并注意到它描述的类缺少构造函数。

4

6 回答 6

40

省略构造函数是不好的做法吗?

是的 - 因为除非您指定任何构造函数,否则 Java 编译器将为您提供与类本身具有相同可见性的构造函数。

假设你所有的方法都是静态的——这似乎很可能,除非你想要多态——你应该创建你的类final并给它一个private构造函数,这样其他开发人员就不会意外地创建你的类的实例,而那将毫无意义。在考虑 API 时,只要我可以消除开发人员做一些愚蠢的事情的能力,我就会这样做 :)

所以像:

public final class Helpers {
    private Helpers() {
    }

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

请注意,通过将多态性排除在等式之外,您还消除了为测试等改变这种行为的可能性。这可能很好——我不相信“永远没有静态”——但值得考虑。

于 2013-04-09T06:39:59.670 回答
6

任何拥有所有没有或不需要任何状态的方法的类都可以通过将构造函数设为私有来自由地降低构造函数的可见性。

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

与所有java.lang.Math与您的类做类似工作的静态方法一样,它们已经声明了构造函数,private这样任何人都不会意外地创建该类的实例。

    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}
于 2013-04-09T06:39:48.807 回答
3

不错的做法。但是您给出的示例没有任何可以在 Object 上下文中使用的成员变量。在这种情况下,最好使用静态方法,因为这样您就不需要在调用方法之前分配内存来为类创建对象。

于 2013-04-09T06:40:10.043 回答
1

编译器将为您生成一个默认构造函数(不带参数)。如果你的类没有状态并且没有扩展一个需要初始化的类,你可以让它在不声明显式构造函数的情况下

于 2013-04-09T06:41:44.797 回答
1

省略构造函数是不好的,因为您的类中没有任何实例变量!

构造函数用于初始化实例变量!

仍然如果你跳过构造函数,编译器无论如何都会插入默认构造函数,这很公平!

于 2013-04-09T06:43:19.087 回答
-2

通常在类中定义构造函数是一种很好的编码习惯,尽管每个类都有一个默认构造函数。

但是,如果您没有任何特殊需要使用重载构造函数或制作任何单例模式,那么您可以删除构造函数。

如果您在您的情况下使用静态方法,那么您也不需要定义构造函数,因为您不需要拥有此类的对象。

于 2013-04-09T06:40:43.420 回答