Проверка на ноль перед вызовом super () в copy ctor, Java

1

У меня есть базовый класс Polygon, который реализует интерфейсную форму, и еще один класс Triangle, который расширяет Polygon, теперь в конструкторе копии Triangle мне нужно проверить, не указан ли другой треугольник не как нулевой указатель, но я не могу этого сделать, потому что мне нужно использовать super(), чтобы инициализировать мой массив точек.

здесь мой код: Polygon - абстрактный класс:

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());
}

Спасибо, вперед!

  • 0
    Рекомендуемый способ работы с аргументами, которые не должны быть нулевыми, но являются нулевыми, состоит в том, чтобы генерировать исключение NullPointerException. И это то, что будет делать ваш код. Так что вам не нужно ничего делать. Если вы действительно хотите выбросить более подробное или иное исключение, то посмотрите ответ Лукаса.
  • 0
    спасибо, я действительно хочу бросить одно из моих собственных исключений.
Теги:
nullpointerexception
null
copy-constructor

1 ответ

4
Лучший ответ

Используйте статический вспомогательный метод:

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;
}
  • 1
    Обратите внимание, что Guava имеет встроенный метод Preconditions.checkNotNull() который делает это, и что JDK, начиная с версии 7, имеет Objects.requireNonNull() .
  • 0
    @JBNizet: Да, хорошая мысль. Я постоянно забываю об Objects
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню