Как проверить значения перед созданием объекта?

Попробую использовать в качестве примера программу, вычисляющую расстояние между двумя точками.

Давайте представим, что у меня есть файл Client.java (с классом Client), в котором считываются входные данные и куда мы помещаем System.out.println для записи выходных данных (координаты точки A и координаты точки B), это файл будет выглядеть так:

import java.util.Scanner;
public class Cliente {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        Ponto a = new Ponto(sc.nextDouble(), sc.nextDouble());
        Ponto b = new Ponto(sc.nextDouble(), sc.nextDouble());
        System.out.println((int) Math.floor(a.dist(b)));
        sc.close();
    }
}

И у меня есть еще один файл под названием Point.java (с классом Point), в этом файле я должен перед созданием объекта проверить, превышают ли координаты x или y для каждой точки 0, и только после того, как эта проверка будет выполнена, я собираюсь создайте точку, если какая-либо из точек отрицательна, она должна вывести «iv». Другими словами, код должен выглядеть примерно так:

class Ponto {
    private double x, y;
    check(x);
    check(y);
    
    public Ponto(double x, double y) {
        this.x = x;
        this.y = y;
    }
    
    public double dist(Ponto p) {
        double dx = x - p.x;
        double dy = y - p.y;
        return Math.sqrt(dx * dx + dy * dy);
    }
    
    public static void check(double x, double y) {
        if (x < 0 || y < 0) {
            System.out.println("iv");
        }
    }
}

Я думал, что это будет сделано именно так, но эта «версия» выдает ошибки, а другие «версии», которые мне удалось сделать, объект всегда создавался перед проверкой... Может ли кто-нибудь объяснить, чего мне не хватает?

Примером ввода и вывода для этой задачи может быть:

0,0 0,0
2,0 2,0

Вывод: 2

Другой пример:

-1.0 1.0
-1.0 1.0

вывод: iv

Выполните проверку в конце конструктора.

shmosel 27.02.2024 02:11

Ваша проверка вызывается неправильно, и даже если она вызывается правильно, проверка на самом деле ничего не делает. Вы должны вызвать его в конструкторе и создать исключение для обработки. т.е. IllegalArgumentException

BIBOO unit 27.02.2024 02:11

А еще check(x) vs check(double x, double y) — вы видите в этом проблему?

Scary Wombat 27.02.2024 02:13

Конструкторы @ScaryWombat всегда выдают исключения, если проверяют параметры, поэтому объект не создается. Например new Integer("one") бросит NumberFormatException. Вы можете добавить статический метод для проверки параметров конструктора или фабричный метод, который будет возвращать null без исключения, но это все равно придется проверять, и Java заставит вас добавить эту проверку, если выдаст обычное проверенное исключение (почему Integer.parseInt(), который следует использовать вместо new Integer(...), все равно выдает исключение).

John Bayko 27.02.2024 03:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конструктор должен быть коротким и понятным. Но проверка аргументов — вполне законная задача конструктора.

Выдать исключение недопустимого аргумента после проверки в конструкторе. В случае броска построение прерывается, экземпляр объекта не создается.

// Constructor
public Point ( final double x, final double y ) 
{
    if ( x < 0 || y < 0 ) { throw new IllegalArgumentException( … ) ; }
    this.x = x;
    this.y = y;
}

Если проверка сложна, например, включает поиск в базе данных, вам следует использовать объект Builder для сбора и проверки входных данных перед созданием объекта основного класса.

Джакартская проверка может оказаться вам полезной.

Другие вопросы по теме