处理重复的方法头

问题描述

我是编码新手,所以让我们把它排除在外。另外,我目前正在使用 Java。 我想以两种不同的方式实例化 Line 对象:

public Line(double x1,double y1,double x2,double y2){}//creates a line connecting two points

public Line(double x,double y,double dir,double length){}//creates a line extending off of one point

然而,根据编译器,它们都有相同的方法头。

我考虑过向第二个构造函数添加一个无用的参数,但这看起来很混乱且没有必要。有没有人对现在和将来如何处理这样的问题有什么建议?

注意:这个主题只是关于修复标题,而不是关于如何改进我的代码。谢谢!

解决方法

您可以为这两个构造函数调用创建两个不同的静态工厂方法。 根据维基百科:

工厂方法设计模式是“四人帮”之一 描述如何解决重复出现的设计问题的设计模式 设计灵活且可重用的面向对象软件,即 更易于实现、更改、测试和重用的对象。

使用工厂方法设计模式代替常规类 用于保持编程的 SOLID 原则的构造函数, 将对象的构造与对象本身解耦

工厂方法本质上是可以有不同名称(并且不必使用类的名称)和不同数量的参数甚至与前一个参数相同数量的参数的方法。你可以这样做:

public static Line createJoining(double x1,double y1,double x2,double y2){...}
public static Line createExtending(double x1,double y2){...}

那么你可以有一个这样的构造函数

public Line(double x1,double y2){}//creates a line connecting two points

createJoining()createExtending() 中,你可以调用这个构造函数, 并将您不同的程序逻辑放在这两个工厂方法中。

createJoining()createExtending(),必须像这样返回 Line 的新实例:

public static Line createJoining(double x1,double y2){
  // program logic goes here,where you can do some calculations

   return new Line(x1,y1,x2,y2);
}

public static Line createExtending(double x1,double y2){
// program logic goes here,y2);
}

使用示例,

Line joinedLine = Line.createJoining(0.1,3.5,10.5,1.0);
Line extendedLine = Line.createExtended(0.6,29.4,20.0,2.0);

More info about Factory Methods here

,

另一种方法是避免相同的方法头,同时使用更有意义的参数类型:

import java.awt.geom.Point2D;
…
        public Line(Point2D.Double p1,Point2D.Double p2) { … }

        public Line(Point2D.Double p,double dir,double length) { … }