2013-03-30 1 views
1

나는 나의 소스 코드를보고 있었고 무엇이 잘못되었는지를 알 수 없다. 내가 생각하는 문제는 서클 클래스에 있습니다. 에서 뮤 테이타와 접근자를 호출하면 DriverCircle 클래스가 잘못 출력됩니다. getDiameter는 단지 0을 출력합니다. 내 setter 및 getter 메소드가 작동하지 않는 이유는 무엇입니까?

public class Circle{ 
    private double radius; 
    private double pi; 
    private double diameter; 
    private double circumference; 
    private double area; 

    public Circle(){ 
     pi = Math.PI; 
     radius = 0; 
    } 

    public Circle(double radius){ 
     this.radius = radius; 
    } 
    public void setDiameter(){ 
     diameter = (2 * radius); 
    } 
    public double getDiameter(){ 
     //diameter = 2 * radius; 
     return diameter; 
    } 
    public void setCircumference(){ 
     circumference = (2 * pi * radius); 
    } 
    public double getCircumference(){ 
     //circumference = 2 * pi * radius; 
     return circumference; 
    } 
    public double getArea(){ 
     //area = pi * Math.pow(radius, 2); 
     return area; 
    } 
    public void setArea(){ 
     area = (pi * Math.pow(radius, 2)); 
    } 
    public void setRadius(double radius){ 
     this.radius = radius; 
    } 
    public double getRadius(){ 
     return radius; 
    } 
    public String toString(){ 
     return "The radius is " + radius; 
    } 
} 

(테스터)

...는 생성자에 값을 제공 할 때

import java.util.Scanner; 

public class CircleDriver { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter the radius: "); 
     Circle[] circles = new Circle[10]; 
     Circle objectCircle = new Circle(); 
     objectCircle.setRadius(input.nextDouble()); 


     circles[1] = new Circle(); 
     circles[2] = new Circle(2.0); 
     circles[3] = new Circle(3.5); 
     circles[4] = new Circle(5.0); 
     circles[5] = new Circle(0.0); 
     circles[6] = new Circle(15); 
     circles[7] = new Circle(25); 
     circles[8] = new Circle(-7); 
     circles[9] = new Circle(-10.0); 

     System.out.println("Initial call to toString():"); 
     for (Circle c : circles) 
      {System.out.println("\t" + c);} 

     System.out.println("Call to getRadius (should be same as above):"); 
     for (Circle r : circles) 
      {if (r != null) 
       {System.out.println("\t" + r.getRadius());}} 

     System.out.println("Call to getDiameter (should be twice the value shown above):"); 
     for (Circle d : circles) 
      {if (d != null) 
       {System.out.println("\t" + d.getDiameter());}} 

     System.out.println("Calls to getCircumference:"); 
     System.out.println("\tShould be 2 * PI: " + circles[1].getCircumference()); 
     System.out.println("\tShould be 0.0: " + circles[5].getCircumference()); 

     System.out.println("\nCall to getArea:"); 
     System.out.println("\tShould be PI: " + circles[1].getArea()); 
     System.out.println("\tShould be 0.0: " + circles[5].getArea()); 

     System.out.println("Testing out the setRadius method:"); 
     for (int i = 0; i < circles.length/2; i++) 
      {if (circles[i] != null) 
       {circles[i].setRadius(i);}} 

     System.out.println("Call to toString after setting the first half of the objects:"); 
     for (Circle c : circles) 
      {System.out.println("\t" + c);} 
    } 
} 
+1

세터 메소드에는 매개 변수가 있어야하며 매개 변수를 사용하여 필드를 설정해야합니다. 그렇지 않으면 실제로는 세터 메소드가 아닙니다. 현재의 setter 메소드는 모두 버려야합니다. –

+0

직경, 둘레 및 면적을 변수로 저장하면 안됩니다. 반경을 사용하는 getter 방법으로 계산하십시오. – Ignacio

답변

2

귀하의 setter 메소드는 매개 변수를 가지고 필드를 설정하는 매개 변수를 사용해야합니다. 그렇지 않으면 실제로는 세터 메소드가 아닙니다. 현재 설정 메서드는 모두 setRadius(...)을 제외하고 모두 버려야하며 대부분의 계산은 각각의 getter 메서드에서 수행해야합니다.

즉,하지

public void setCircumference(){ 
    circumference = (2 * pi * radius); 
} 

public double getCircumference(){ 
    //circumference = 2 * pi * radius; 
    return circumference; 
} 

아니라

public double getCircumference(){ 
    return 2 * Math.PI * radius; 
} 
+0

감사합니다. – anonymous

+0

@anonymous : 환영합니다. 도움이 되었기 때문에 기쁩니다! –

1

PI가 초기화되어 있지 않습니다. 또한 pi를 인스턴스 멤버로 저장하는 것은 다소 이상합니다. 계산에 사용자 Math.PI 만 있으면됩니다.

1

setDiameter()으로 전화하지 마십시오. 생성자는 반지름의 값을 설정하지만 직경 변수 설정에 대해서는 아무 것도하지 않습니다!

당신은 getDiameter()를 재 작성 할 수 있습니다 :

public double getDiameter() { 
    return 2.0 * radius; 
} 
+0

나는 setDiameter를 자르고 방금 getDiameter 메소드를 만들었습니다. 고맙습니다! – anonymous

0

당신은 반경을 설정하는 원 객체를 구축,하지만 당신은 직경을 설정하지 않습니다. 아마도 생성자에서 setDiameter()를 호출해야합니다.

아직 완전히 불필요하므로 setDiameter() 메서드를 삭제하는 것이 좋습니다. 단순히 getDiameter()가 2 * 반지름을 반환하도록 만듭니다.

0

두 가지 문제점이 있습니다.

먼저 이중 생성자를 사용하는 경우 pi 값을 설정하지 마십시오. setDiameter()에 대한 명시 적 호출이 없다,

public Circle(double radius){ 
    this(); // calls the no-args constructor 
    this.radius = radius; 
} 

둘째, 당신은 또한 인자없는 생성자뿐만 아니라 설정 같은 반경의 값을 사용한다. 재미있게도 그 방법은 잘못된 이름입니다. 반경이 0이 아니면 언제나 계산해야합니다. setArea도 같은 방법입니다.이 메서드 호출에 아무 것도 전달하지 않을 것입니다. 여기에 내가 추천 할 것입니다 무엇 :

  • calculateDiameter-setDiameter는 의도는 명확하게 이름을 바꿉니다. 이름을 변경하는 이유는이 클래스가 set 및 get과 관련하여 JavaBean 규칙을 따르도록하기 위함입니다.
  • public Circle(double radius)에는 즉시 calculateDiameter()으로 전화하십시오.
  • setRadius()이 호출 될 때마다 즉시 calculateDiameter을 호출하거나 JavaBean 규칙을 위반하는 즉시 값을 설정 한 후 호출하십시오.
  • getArea에 대해 똑같은 작업을 수행하는 것이 좋습니다.하지만 그 부분을 독자에게 연습으로 남겨 두겠습니다. 코드에서

, 간단한 예 :

그냥 반경을 사용하는 모든 기능을 업데이트하지 않습니다 반경을 설정
public Circle(double radius){ 
    this(); // calls the no-args constructor 
    this.radius = radius; 
    calculateDiameter(); 
} 

public void setRadius(double r) { 
    radius = r; 
    calculateDiameter(); 
} 
0

; 그 함수를 명시 적으로 호출해야합니다. 그렇지 않으면 Java 기본값 인 0으로 유지됩니다. Circle (반경) 메소드에서 오류를 검사합니다. 그런 식으로 음수가 반경 세트로 변환되지 않습니다.