Могу ли я в конструкторе делать вычисления?

144
25 января 2020, 15:30

У меня есть класс Figure, который описывает площадь и периметр. У меня есть также множество фигур, унаследованных от этого класса. Как я могу задать для каждой фигуры определение площади и периметра? Можно это делать в конструкторе (как я и сделал) или же необходимо переопределять сеттер родителя? Или вообще иначе как-то я должен сделать? Подскажите пожалуйста. Заранее спасибо

Вот класс родитель для всех фигур:

public class Figure {
    private double area;
    private double perimeter;
    public double getArea() {
        return area;
    }
    public void setArea(double area) {
        this.area = area;
    }
    public double getPerimeter() {
        return perimeter;
    }
    public void setPerimeter(double perimeter) {
        this.perimeter = perimeter;
    }
}

Вот мой круг:

public class Cirlce extends Figure {
    private double radius;
    public Cirlce(double radius) {
        this.radius = radius;
        super.setArea(radius*2*Math.PI);
    }
}
Answer 1

Класс Circle:

UPD:Код был переделан,по желанию автора, теперь переменные класса Figure нельзя изменять, задаются один раз при создании

В конструкторе лучше не помещать какие либо вычисления, ибо там могут быть викунуты различные исключения, так же лучшек не помещать туда методов, так как вызов некоторых методов, в которых , например, могут быть заранее не определены или не инициализированы какие либо переменные. Однако, метод может быть вызван, если вы на 100% знаете, что там не будет описаных выше проблем. Такой метод желательно должен только определять объект, и манипулировать только переменными, которые он получает, иначе, как говорил раннее , может быть проблема. В mathArea() и mathPerimeter() необходимо будет создать обработку исключений. Есть так называемый public static метод, в который передается значение радиуса, и если оно не соблюдает условия, объект не создается, без этого метода в конструкторе, в методе setRadius(..); при передачи отрицательного значения объект бы был СОЗДАН, и возвращал бы дэфолтные значения double area и parameter, что не допустимо. Есть исключение NullPointerException при попытке создать и изменить объект , как показано в qew.java , и необходимо для каждой фигуры устанавливать индивидуальную обработку исключений в методах, при создании и тд, где это собственно возможно. Так же есть другие плюсы такой архитектуры, если интересно какие , отпишите

        public class Circle extends Figure {
    private double radius;
    public static Circle createCircle(double radius)
    {
        if(radius <= 0) {System.out.println("WHY ? Stop it...");return null;} else return new Circle(radius);
    }
    public Circle(double radius) {
        setRadius(radius);
    }
    private double mathArea()
    {
        return Math.pow(radius,2)*Math.PI;
    }
     private double mathPerimeter()
    {
        return 2*radius*Math.PI;
    }
    private void setRadius(double radius){
        this.radius = radius;
        super.setPerimeter(mathPerimeter());
        super.setArea(mathArea());
            }
}

Класс qew.java , у меня с main методом: Тест, попытка создать объект, с отрицательным радиусом.

public class qew {
public static void main(String[] args) {
Circle c = Circle.createCircle(4);
System.out.println(c.getArea());
System.out.println(c.getPerimeter());
}
}

Класс Figure: Класс абстрактный, ибо зачем нужны его экземпляры, он должен предоставлять ОБЯЗАТЕЛЬНЫЕ переменные, которые 100% будут использованы для его потомков, иначе, нужно определить их в классах - потомках. К методам это относится так же.

    abstract public class Figure {
    private double area;
    private double perimeter;
    public double getArea() {
        return area;
    }
    public void setArea(double area){
    this.area = area;
    };
    public double getPerimeter() {
        return perimeter;
    }
    public void setPerimeter(double perimeter){
    this.perimeter = perimeter;
    };
}
Answer 2

Вы можете создать абстрактный класс Figure и в нем задать поля "площадь" и "периметр". А потом создать абстрактные методы getPerimetr и getArea и в каждом классе который наследуется от фигуры переопределять их.

public abstract class Figure {
    private double area;
    private double perimeter;
    public double getArea();
    public double getPerimeter();
}
public class Cirlce extends Figure {
    private double radius;
    public Cirlce(double radius) {
        this.radius = radius;
    }
    @Override
    public double getArea(){
        return radius*radius*Math.PI;
    @Override
    public double getPerimeter(){
        return radius*2*Math.PI;
    } 
}
public class Rectangle extends Figure {
    private double length;
    private double width;
    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    @Override
    public double getArea(){
        return length*width;
    @Override
    public double getPerimeter(){
        return 2*(length*width);
    } 
}

А вычислять в конструкторе ничего не стоит

READ ALSO
Получение всех Cookie в Webview

Получение всех Cookie в Webview

Я использую Webview и мне бы хотелось в один момент получить все Cookie и сохранить ихВ другой же момент, мне бы хотелось загрузить все Cookie из одного...

162
Как сделать задержку при открытии тега details с помощью JQuery?

Как сделать задержку при открытии тега details с помощью JQuery?

По некоторым причинам выполнил вертикальное выпадающее меню на сайте с помощью detailsПри наведении мыши появляется выпадающий список

134
Не подключаются стили, картинки и js Java Spring

Не подключаются стили, картинки и js Java Spring

Есть вот такая структура проекта

146
Как получить доступ к методу из контруктора?

Как получить доступ к методу из контруктора?

Имеется такой кусок, пытаюсь вызвать метод класса внутри конструктора, те

164