Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使类抽象还是使构造函数私有_Java_Oop - Fatal编程技术网

Java 使类抽象还是使构造函数私有

Java 使类抽象还是使构造函数私有,java,oop,Java,Oop,我脑子里有一个设计问题。假设我有一个只有静态方法的类,那么下面两种方法中最好的设计选项是什么 使类抽象化 将构造函数设为私有,以便在 类可以创建该类的对象 选择取决于形势,还是有一条最好的路可走?为什么?将类抽象为假定您希望继承该类。如果你想让这一切发生,那就把它抽象化 如果您只有静态方法(因此它是某种实用程序类),那么请使用第二种方法。 尽管创建这个类的实例没有错,因为这样做没有好处也没有坏处,但最好的做法是将构造函数设置为实用程序类的私有构造函数。私有构造函数是肯定的。通常,只有静态方法

我脑子里有一个设计问题。假设我有一个只有静态方法的类,那么下面两种方法中最好的设计选项是什么

  • 使类抽象化
  • 将构造函数设为私有,以便在 类可以创建该类的对象

选择取决于形势,还是有一条最好的路可走?为什么?

将类抽象为假定您希望继承该类。如果你想让这一切发生,那就把它抽象化

如果您只有静态方法(因此它是某种实用程序类),那么请使用第二种方法。

尽管创建这个类的实例没有错,因为这样做没有好处也没有坏处,但最好的做法是将构造函数设置为实用程序类的私有构造函数。

私有构造函数是肯定的。通常,只有静态方法的类应为:

public final class Utility { 
    public static void foo() { }
    // ... etc.
}
如果您将其声明为抽象,那么可以合理地假设您打算将其继承,而您的描述并非如此


最终声明确保它不能被延长

让我们看看标准类的开发人员做了什么:

public class Arrays {
    // Suppresses default constructor, ensuring non-instantiability.
    private Arrays() {
    }

public class Collections {
    // Suppresses default constructor, ensuring non-instantiability.
    private Collections() {
    }
我在这里看到了一种模式

这是有意义的,因为抽象类意味着类应该是子类,而当您的类是一个只有静态方法的实用类时,情况就不是这样了。

我要说“两者都有”

使类抽象可以防止潜在用户创建其实例,即使使用反射也是如此。它保证用户注意到这是纯实用程序类,不应该被实例化


抽象类的构造函数不应该是公共的。如果类专用于扩展,则应该保护构造函数,因为它无论如何只能由子类使用。但是您的类不能被继承。因此,它的构造函数只能是私有的。此外,为了安全起见,构造函数可以抛出
IllegalStateException
。在这种情况下,即使将来有人将其公开,他也不能在不更改代码的情况下调用它

我认为更好的方法是使用私有构造函数创建最终类。因为抽象类的目的是作为子类的基函数。

您需要单例模式吗?通常实用类(这一个似乎是)带有一个私有构造函数。@SergeyPauk只是一个有根据的猜测,但“只有静态方法的类”我不需要模式。但如果我最终确定,如果我想的话,我以后就不能再继续上课了。那么这是一个好方法吗?如果您将构造函数设置为私有,那么默认情况下,它将使您的类不可扩展。您还提到,该类将只包含静态方法。因此,扩展类也意味着更少:)太好了。这是有道理的!学习一些设计原则的好地方:)快乐编码。是否真的有必要让它成为最终版本?如果我想在将来扩展它呢?那么你不会宣布它为最终版本。我很乐意承认,我从未遇到过想要扩展实用程序类的情况。一条评论指出,将构造函数设为私有会阻止我扩展该类。那么,使它成为最终版本会给我带来额外的价值吗?@DesirePG仔细看看这个问题,这是最重要的答案,你的意思是我需要一个带有私有构造函数的抽象类?@DesirePG,IMHO是的。不过,也可以看看其他答案。其他人认为,只有当你想扩展类时,才应该定义类
抽象
。声明构造函数
私有
只会禁用外部继承。。。在类内部,您仍然可以使用命名或匿名派生类继承它。缺少
抛出异常…
可能