在Java的copy-ctor中调用super()之前进行Null检查
我有一个实现接口形状的基类多边形和另一个扩展多边形的类三角形,现在在三角形复制构造函数中,我需要检查给定的另一个三角形是否不是空指针,但我不能这样做,因为我必须使用super来初始化我的点数组 这是我的密码: 多边形-抽象类:在Java的copy-ctor中调用super()之前进行Null检查,java,nullpointerexception,null,copy-constructor,Java,Nullpointerexception,Null,Copy Constructor,我有一个实现接口形状的基类多边形和另一个扩展多边形的类三角形,现在在三角形复制构造函数中,我需要检查给定的另一个三角形是否不是空指针,但我不能这样做,因为我必须使用super来初始化我的点数组 这是我的密码: 多边形-抽象类: public abstract class Polygon implements Shape { private Point[] points; /** * Build a Polygon that hold a set of Points. * * @para
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());
}
谢谢你 使用静态辅助方法:
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;
}
使用静态辅助对象方法:
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;
}
处理不应为null但为null的参数的建议方法是抛出NullPointerException。这就是你的代码所要做的。所以你不需要做任何事。如果你真的想抛出一个更详细的异常,或者不同的异常,那么看看Lukas的答案。thnks,我真的想抛出一个我自己的异常。处理不应该为null但为null的参数的推荐方法是抛出NullPointerException。这就是你的代码所要做的。所以你不需要做任何事。如果你真的想抛出一个更详细或不同的异常,那么请看Lukas的答案。thnks,我真的想抛出一个我自己的异常。请注意,Guava有一个内置的Premissions.checkNotNull方法来实现这一点,而JDK,从版本7开始,就有Objects.requireNonNull。关于泛型助手方法,我做了其他一些事情,只需在Polygon中编写该方法:请注意,Guava有一个内置的Premissions.checkNotNull方法可以实现这一点,而且自版本7以来,JDK有Objects.requireNonNull。关于通用帮助器方法,我做了一些其他事情,只需在Polygon中编写该方法: