Описать класс Треугольник и его обьекты

Код 1

package roga.koputa.v;
/*
Описать класс Треугольник. В качестве свойств возьмите длины сторон треугольника.
Реализуйте метод, который будет возвращать площадь этого треугольника. Создайте
несколько объектов этого класса и протестируйте их.
 */
public class TriangleExample {

	public static void main(String[] args) {
		Triangle t1 = new Triangle();
		Triangle t2 = new Triangle((int)(Math.random()*50), (int)(Math.random()*50), (int)(Math.random()*50));
		Triangle t3 = new Triangle(7, 7, 7);
		System.out.println(t1);
		System.out.println(t2.toString());
		System.out.println(t3);
		t1.setA(3);
		t1.setB(4);
		t1.setC(5);
		t1.setSquare();
		System.out.println(t1.getSquare());
		System.out.println(t2.getSquare());
		System.out.println(t3.getSquare());	
		System.out.println(t1);
		System.out.println(t2);
		System.out.println(t3);
	}
}

Код 2

package roga.koputa.v;

public class Triangle {
	private double a;
	private double b;
	private double c;
	private double square;
	private boolean exist;

	public Triangle(double a, double b, double c) {
		super();
		this.a = a;
		this.b = b;
		this.c = c;
		setSquare();
	}

	public Triangle() {
		super();
	}

	public double getA() {
		return a;
	}

	public void setA(double a) {
		this.a = a;
	}

	public double getB() {
		return b;
	}

	public void setB(double b) {
		this.b = b;
	}

	public double getC() {
		return c;
	}

	public void setC(double c) {
		this.c = c;
	}

	public double getSquare() {
		return square;
	}

	public void setSquare() {
		setExist();
		if (exist) {
			double p = (a + b + c) / 2;
			this.square = Math.sqrt(p * (p - a) * (p - b) * (p - c));// формула Герона
		} else {
			this.square = 0;
		}
	}

	public boolean isExist() {
		return exist;
	}

	public void setExist() {
		if ((a + b > c) && (a + c > b) && (b + c > a)) {
			this.exist = true;
		} else {
			this.exist = false;
		}
	}

	@Override
	public String toString() {
		return "Трикутник зі сторонами a=" + a + ", b=" + b + " та c=" + c
				+ (exist ? (" існує, його площа рівна " + square + "."): (" не існує."));
	}

}

Логичнее было бы в методе получения площади

	public double getSquare() {

Вызывать метод

	public void setSquare() {

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

1 симпатия

Да, можлива і така поведінка. У прикладі, я такий випадок не використав та відповідно не продемострував…

По аналогії в інших методах теж потрібно зробити правки. Буде якось так:
Код 1

package roga.koputa.v;
/*
Описать класс Треугольник. В качестве свойств возьмите длины сторон треугольника.
Реализуйте метод, который будет возвращать площадь этого треугольника. Создайте
несколько объектов этого класса и протестируйте их.
 */
public class TriangleExample {

	public static void main(String[] args) {
		Triangle t1 = new Triangle();
		Triangle t2 = new Triangle((int)(Math.random()*50), (int)(Math.random()*50), (int)(Math.random()*50));
		Triangle t3 = new Triangle(7, 7, 7);
		System.out.println(t1);
		System.out.println(t2.toString());
		System.out.println(t3);
		t1.setA(3);
		t1.setB(4);
		t1.setC(5);
		t1.setSquare();
		System.out.println(t1.getSquare());
		System.out.println(t2.getSquare());
		System.out.println(t3.getSquare());	
		System.out.println(t1);
		System.out.println(t2);
		System.out.println(t3);
		t3.setA(0);
		t3.setB(3);
		System.out.println(t3);
		System.out.println(t3.getSquare());
	}
}

Код 2

package roga.koputa.v;

public class Triangle {
	private double a;
	private double b;
	private double c;
	private double square;
	private boolean exist;

	public Triangle(double a, double b, double c) {
		super();
		this.a = a;
		this.b = b;
		this.c = c;
		setSquare();
	}

	public Triangle() {
		super();
	}

	public double getA() {
		return a;
	}

	public void setA(double a) {
		this.a = a;
	}

	public double getB() {
		return b;
	}

	public void setB(double b) {
		this.b = b;
	}

	public double getC() {
		return c;
	}

	public void setC(double c) {
		this.c = c;
	}

	public double getSquare() {
		setSquare();
		return square;
	}

	public void setSquare() {
		setExist();
		if (exist) {
			double p = (a + b + c) / 2;
			this.square = Math.sqrt(p * (p - a) * (p - b) * (p - c));// формула Герона
		} else {
			this.square = 0;
		}
	}

	public boolean isExist() {
		setExist();
		return exist;
	}

	public void setExist() {
		if ((a + b > c) && (a + c > b) && (b + c > a)) {
			this.exist = true;
		} else {
			this.exist = false;
		}
	}

	@Override
	public String toString() {
		return "Трикутник зі сторонами a=" + a + ", b=" + b + " та c=" + c
				+ (isExist() ? (" існує, його площа рівна " + getSquare() + "."): (" не існує."));
	}

}

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

А якщо людина зробить setA та потім toString?