1. ホーム
  2. java

[解決済み] 円形クラスの複数コンストラクタ

2022-02-12 08:27:40

質問

Circleクラスを修正して、半径を表すdoubleと色を表すStringの2つの引数を持つCircleインスタンスを構築するための第3のコンストラクタを含めようとしています。また、このコンストラクタを使用してCircleのインスタンスを構築するためにメインクラスを変更します。私はこれで困っています、私はコンストラクタCircleが決して使用されないというメッセージを受け取り続けます。コードを見てください。

 public class Circle {
        private double radius;
        private String color;


        public Circle() {
            radius = 1.0;
            color = "red";
        }


        public Circle(double r) {
            radius = r;
            color = "Blue";
        }

        public Circle(double r, String c) {
            radius = r;
            color =c;
        }



        public double getRadius() {
            return radius;
        }

        public void setRadius(double newRadius) {
            radius = newRadius;
        }


        public String getColor()
        {
            return color;
        }

        public void setColor(String newColor) {
            color=newColor;
        }



        public double getArea() {
            return radius*radius*Math.PI;
        }
    }

    public class Main {

        public static void main(String[] args) {

            Circle c1 = new Circle();
            System.out.println("The circle has radius of " +     c1.getRadius());
            System.out.println("and area of " + c1.getArea());

            Circle c2 = new Circle(2.5);
            System.out.println("The circle has radius of " + c2.getRadius());
            System.out.println("and area of " + c2.getArea());


            Circle c3 = new Circle(0.5);
            c3.setColor("Green");
            System.out.println("The circle has radius of " 
            + c3.getRadius());
            System.out.println("and area of " + c3.getArea());
            System.out.println("color is: " + c3.getColor());




            Circle c5 = new Circle();
            c5.setRadius(500.0);
            System.out.println("radius is: " + c5.getRadius());
            c5.setColor("Yellow");
            System.out.println("color is: " + c5.getColor());


        }
    }

解決方法は?

まあ、使っていないのだから、このメッセージは驚くには値しないでしょう。ただ、2つの引数を持つコンストラクタの呼び出しをどこかに貼り付けるだけです(例, Circle c3 = new Circle(0.5, "Green"); というメッセージが表示されます。もちろん、インスタンス生成をすべて2引数のコンストラクタに変更すると、0引数や1引数のバージョンでも警告が表示されるようになります。

あるいは、コンストラクタの定義を変更することも可能です。

public class Circle {
    public Circle() {
        this(1.0, "red");
    }


    public Circle(double r) {
        this(r, "Blue");
    }

    public Circle(double r, String c) {
        radius = r;
        color = c;
    }
    ...
}

ただ、色のデフォルト値が、デフォルトの半径を使うときは "red"、半径を指定するときは "Blue"というのはおかしいと言わざるを得ませんね。その場合は、最初のコンストラクタを次のように変更することをお勧めします。

public Circle() {
    this(1.0);
}

を使うことも検討してみてください。 enum 大文字と小文字の違いによる問題を避けるためです ("red" と "Red" のように)。大文字と小文字の違い ("red" と "Red") を避けるため、いつでも enum の値と String を使用して、組み込みの enum メソッド name()valueOf(String) .