Java 构造函数重载的工作原理
如何创建Java 构造函数重载的工作原理,java,constructor-overloading,Java,Constructor Overloading,如何创建工厂。创建调用任务。(子类型)构造函数,如果我不能修改工厂。创建方法(只能修改任务和子类型类) 公共类测试{ 公共静态void main(字符串[]args){ 创建(新子类型()); //输出: //子类型的任务实例:true //可调用(问题:我希望调用子类型构造函数) } 公共静态类子类型实现了可调用{ @凌驾 公共对象调用()引发异常{ 返回null; } } 公共静态类任务{ 私有可调用可调用; 私有亚型; 公共任务(子类型子类型){ System.out.println(“子
工厂。创建调用任务。(子类型)
构造函数,如果我不能修改工厂。创建方法(只能修改任务和子类型类)
公共类测试{
公共静态void main(字符串[]args){
创建(新子类型());
//输出:
//子类型的任务实例:true
//可调用(问题:我希望调用子类型构造函数)
}
公共静态类子类型实现了可调用{
@凌驾
公共对象调用()引发异常{
返回null;
}
}
公共静态类任务{
私有可调用可调用;
私有亚型;
公共任务(子类型子类型){
System.out.println(“子类型”);
this.subType=子类型;
}
公共任务(可调用可调用){
系统输出打印项次(“可调用”);
this.callable=可调用;
}
}
公共静态类工厂{
//如果将方法参数类型更改为子类型,它将调用
//任务。(子类型)构造函数,但我无法修改它
公共静态任务创建(可调用任务){
System.out.println(“子类型的任务实例:”+(子类型的任务实例));
返回新任务(任务);
}
}
}
在任务
类上创建一个公共工厂静态方法,并使构造函数私有或包私有
public static class Task {
private Callable callable;
private SubType subType;
private Task(SubType subType) {
System.out.println("Subtype");
this.subType = subType;
}
private Task(Callable callable) {
System.out.println("callable");
this.callable = callable;
}
public static Task create ( final Callable callable )
{
if ( callable instance of SubTask )
{
return new Task( (SubType) callable );
}
return new Task( callable );
}
}
public static class Factory {
// Note that we are now calling Task's factory method
public static Task create(Callable task) {
System.out.println("task instanceof SubType: " + (task instanceof SubType));
return Task.create(task);
}
}
在任务
类上创建公共工厂静态方法,并将构造函数设置为私有,或将包设置为私有
public static class Task {
private Callable callable;
private SubType subType;
private Task(SubType subType) {
System.out.println("Subtype");
this.subType = subType;
}
private Task(Callable callable) {
System.out.println("callable");
this.callable = callable;
}
public static Task create ( final Callable callable )
{
if ( callable instance of SubTask )
{
return new Task( (SubType) callable );
}
return new Task( callable );
}
}
public static class Factory {
// Note that we are now calling Task's factory method
public static Task create(Callable task) {
System.out.println("task instanceof SubType: " + (task instanceof SubType));
return Task.create(task);
}
}
选择调用哪个重载方法或构造函数是在编译时根据参数的声明类型完成的。因此,即使任务
的实际具体类型是子类型
,其声明的类型也是可调用的
,第二个构造函数(以可调用为参数)将始终被调用
因此,如果希望在使用子类型构造任务时发生不同的情况,则应在任务构造函数中测试可调用的类型:
public static class Task {
private Callable callable;
private SubType subType;
public Task(Callable callable) {
if (callable instanceof SubTask) {
System.out.println("Subtype");
this.subType = subType;
}
else {
System.out.println("callable");
this.callable = callable;
}
}
}
选择调用哪个重载方法或构造函数是在编译时根据参数的声明类型完成的。因此,即使任务
的实际具体类型是子类型
,其声明的类型也是可调用的
,第二个构造函数(以可调用为参数)将始终被调用
因此,如果希望在使用子类型构造任务时发生不同的情况,则应在任务构造函数中测试可调用的类型:
public static class Task {
private Callable callable;
private SubType subType;
public Task(Callable callable) {
if (callable instanceof SubTask) {
System.out.println("Subtype");
this.subType = subType;
}
else {
System.out.println("callable");
this.callable = callable;
}
}
}
请注意,这种类型的检查是无效的。可以使用Callable的子类型构造任务应该是一件好事。你为什么要改变它?@markspace,因为这是OP想要的,他不能改变工厂的实现,从而使Factory.create()
方法过载。是的,我知道。(事实上,我很难分析OP想要说什么。)我只是让OP知道他想做什么可能是一种不好的做法。我想知道目标是什么,他要求做什么似乎有问题。没问题。这可能确实是一个XY问题。@JBNizet谢谢你的回答!我只是想修改一个开源库。因此,对Factory.create
的更改将导致太多更改。您的解决方案并不是很糟糕的做法(库已经使用了它),但是Task
class还有许多其他字段,这使得它更糟。因此,我倾向于在Alexander Pogrebnyak Waybnote中进行这种类型的检查。可以使用Callable的子类型构造任务应该是一件好事。你为什么要改变它?@markspace,因为这是OP想要的,他不能改变工厂的实现,从而使Factory.create()
方法过载。是的,我知道。(事实上,我很难分析OP想要说什么。)我只是让OP知道他想做什么可能是一种不好的做法。我想知道目标是什么,他要求做什么似乎有问题。没问题。这可能确实是一个XY问题。@JBNizet谢谢你的回答!我只是想修改一个开源库。因此,对Factory.create
的更改将导致太多更改。您的解决方案并不是很糟糕的做法(库已经使用了它),但是Task
class还有许多其他字段,这使得它更糟。所以,我倾向于用亚历山大·波格雷布尼亚克的方式