Java子类实现强制构造函数

Java子类实现强制构造函数,java,constructor,Java,Constructor,Java中有没有办法强制子类或接口实现具有给定签名的构造函数 假设我有以下两种情况之一: public interface MyInterface { // any methods } 或 现在,有可能做任何需要的事情吗 public class MySubClass extends MyBaseClass { public MySubClass(String s) { } } 或 总是有一个将字符串作为唯一输入参数的构造函数 显而易见的解决方法是创建一个工厂接口,该接口使用

Java中有没有办法强制子类或接口实现具有给定签名的构造函数

假设我有以下两种情况之一:

public interface MyInterface {
    // any methods
}

现在,有可能做任何需要的事情吗

public class MySubClass extends MyBaseClass {
    public MySubClass(String s) { }
}

总是有一个将字符串作为唯一输入参数的构造函数


显而易见的解决方法是创建一个工厂接口,该接口使用一个获取字符串的方法,并在需要时将其注入。这不是我想做的。

不是真的,我认为你能得到的最接近的东西是:

abstract class B {

    public B(String s) {
    }
}

public class A extends B {
    public A(String s) {
        super(s);
    }
} 
这将强制A实现非默认构造函数,该构造函数必须调用
super(String)
,但不能阻止以下操作:

public class A extends B {
    public A() {
        super("");
    }
} 

有很多次我希望这样的东西存在,但遗憾的是它没有。即使像David Soroko所建议的那样也不起作用,因为子类仍然不会被强制使用字符串构造函数——它可以传递它喜欢的任何字符串
super
。简单地说,Java语法本身没有这样的东西


我认为最接近这种能力的是,如果有人构建了一个注释处理器,允许您使用像
@MustHaveUnaryConstructor(String.class)
这样的注释,然后如果任何子类没有这样的构造函数,它会导致编译失败,并告诉您哪个子类违反了约定。但我还没有发现这样的东西,而且我对注释处理的了解还不够,无法自己构建一个。So TL;医生,不,你不能。不,没有。您可以编写单元测试来检查(通过反射)实现接口的所有类是否都有接受字符串的构造函数,但现在还不清楚您希望从中得到什么好处。有些类可能希望构造函数不仅仅需要一个字符串?某些类是否可以有效地硬编码字符串的用途?你想在这里解决什么问题?不,你可以强制子类有一个特定的构造函数,为什么你会在意呢?@ivan即使你创建一个基类只有一个具有所需签名的公共构造函数,你仍然可以创建一个缺少此类构造函数的子类,比如:`public class ParentClass{private ParentClass(){}public ParentClass(String s){}}public class ChildClass扩展ParentClass{public ChildClass(int i){super(String.valueOf(i));}}`@SergMTen:在您使用反射时,任何数量的事情都可能出错,语言无法帮助您。事实上,您必须为此使用反射,这意味着您超出了语言试图帮助您处理接口的领域。但这也意味着您可以轻松编写单元测试来验证它。在这种情况下,您可以完美地使用
函数
而不是
,并使用
函数。应用(conn)
。不需要强制构造函数,因为对象的创建是独立于契约的。
abstract class B {

    public B(String s) {
    }
}

public class A extends B {
    public A(String s) {
        super(s);
    }
} 
public class A extends B {
    public A() {
        super("");
    }
}