package tris; // NOTE: This code has several deliberate bugs. public class Triangle { final int side1, side2, side3; enum Kind {ISOSCELES, EQUILATERAL, SCALENE}; // Ths constructor requires that the first side be equal to the largest public Triangle(int side1, int side2, int side3) { assert side1 >= side2 && side1 >= side3 && (side1 < side2 + side3); this.side1 = side1; this.side2 = side2; this.side3 = side3; } public int getPerimeter() { return side1 + side2 + side3; } public int getArea() { // Here we use Heron's formula to compute the area int halfPerimeter = getPerimeter() / 2; int radicand = halfPerimeter * (halfPerimeter - side1) * (halfPerimeter - side2) * (halfPerimeter - side3); return (int)Math.sqrt(radicand); } public boolean isIsosceles() { return side1 == side2 || side2 == side3 || side1 == side3; } public boolean isEquilateral() { return side1 == side2 && side2 == side3; } public Kind getKind() { if (isIsosceles()) { return Kind.ISOSCELES; } else if (isEquilateral()) { return Kind.EQUILATERAL; } else { return Kind.SCALENE; } } public String toString() { return "Triangle (" + side1 + "," + side2 + "," + side3 + ")"; } }