【问题标题】:Null check before calling super() in copy ctor ,Java在复制 ctor 中调用 super() 之前进行空检查,Java
【发布时间】:2014-05-01 21:51:49
【问题描述】:

我有一个实现接口 Shape 的基类 Polygon 和扩展 Polygon 的另一个类 Triangle ,现在在 Triangle 复制构造函数中,我需要检查给定的另一个三角形是否不是空指针,但我不能这样做,因为我必须使用 super() 来初始化我的 points 数组。

这是我的代码: 多边形 - 抽象类:

public abstract class Polygon implements Shape {
private Point[] points;

/**
 * Build a Polygon that hold a set of Points.
 * 
 * @param points
 *            (Point[])
 */
public Polygon(Point[] points) {
    this.points = points;
}

三角形子类:

public class Triangle extends Polygon {

/**
 * Constructor.
 * Build a Triangle from 3 Point's.
 * @param p1
 * @param p2
 * @param p3
 */
public Triangle(Point p1, Point p2, Point p3) {
    super(new Point[] { p1, p2, p3 });
}

/**
 * Copy constructor.
 * @param other
 */
public Triangle(Triangle other) {
    /*
     * *********************************************
     * 
     * Here is where i want to make the null check .
     * 
     * *********************************************
     */
    super(other.getPoints().clone());
}

先谢谢了!

【问题讨论】:

  • 处理不应为空但为空的参数的推荐方法是抛出 NullPointerException。这就是您的代码将执行的操作。所以你不需要做任何事情。如果您真的想抛出更详细或不同的异常,请参阅 Lukas 的回答。
  • thnks ,我真的很想抛出一个我自己的异常。

标签: java nullpointerexception null copy-constructor


【解决方案1】:

使用静态辅助方法:

public Triangle(Triangle other) {
    super(clonePoints(other));
}

private static Point[] clonePoints(Triangle other) {
     if (other == null) {
         // ...
     }

     return other.getPoints().clone();
}

另外,我经常做的是创建一个更通用的辅助方法:

public Triangle(Triangle other) {
    super(neverNull(other).getPoints().clone());
}

private static <S extends Shape> S neverNull(S notNull) {
     if (notNull == null) {
         // throw a meaningful exception 
         // or return a default value for S if possible / reasonable
     }

     return notNull;
}

【讨论】:

  • 请注意,Guava 有一个内置的 Preconditions.checkNotNull() 方法可以做到这一点,而 JDK,从版本 7 开始,有 Objects.requireNonNull()
  • 关于通用辅助方法,我做了一些别的,只是把方法写在Polygon :)
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多