这个简单的程序使用Scanner从用户处获取半径,然后计算并输出周长和面积。

问题:


在Java中习惯于在println()内放置一个函数调用,还是将返回的值放入一个单独的变量中然后显示该变量更好? >我正确编写计算函数static吗? >

 5.5
Circumference: 
34.55751918948772
Area: 
95.03317777109123
 



评论

1.您可以附加一些样本输出吗? 2.为什么限制半径为in?类名Circle表示更通用的名称。

@GraniteRobert:不必受到限制;起初我只是想过一个int。我可以更改它,并提供示例输出。

我想知道您是否打算在输出中使用单独的行。我以为我误会了我的JAVA。

@GraniteRobert:我实际上很喜欢它们,但是我没有花时间去寻找如何做。无论如何,我想这是另外一件小事。

Java需要赶上时代并添加Tau常量。 tauday.com/tau-manifesto

#1 楼


在Java中是否习惯将函数调用放在println()内,还是将返回的值放入一个单独的变量中然后显示该变量更好呢?


我要说的主要是基于意见的。对于这个小应用程序,我认为将函数方法调用放在println内是很好的。重要的是日志记录),因为您不希望在删除System.out.println或日志记录语句时更改程序行为。这是一个玩具程序吗?


nextInt上使用Scanner时,我看不到需要使用输入验证。也许您想避免使用负数,或者向用户抛出异常或向用户显示错误消息,但这也许就可以了。



使计算函数静态化?


是的,绝对可以。我看不出为什么它们不应该是静态的。鉴于它们的有用性,最好也将它们也具有public


功能要求:您目前不提示任何可能使用户感到困惑。只需一个简单的System.out.println("Enter radius:");就可以了。


总体而言,您的代码看起来非常完美。一个未成年人nitpick是您在这里超出必要的空间:

System.out.println("Circumference: ");
System.out.println("Area: ");

另一个未成年人nitpick是您的Scanner变量可以命名为scannerinput代替。 (即使scScanner的一个非常普通的变量名)#perfectionist-naming。

评论


\ $ \ begingroup \ $
谢谢你的挑剔。 ;-)我忘了这显示在单独的行上,所以多余的空间是无用的。
\ $ \ endgroup \ $
– Jamal♦
14年7月16日在21:38

#2 楼

创建一个Circle对象可能是更惯用的Java。该代码将更流畅地读取(例如,circle.getCircumference())。它还为您提供了一个验证半径是否为负值的好地方。

import java.util.Scanner;

public class Circle {
    private final double radius;

    public Circle(double radius) {
         if (radius < 0) {
             throw new IllegalArgumentException();
         }
         this.radius = radius;
    }

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

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

    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            double radius = sc.nextDouble();
            Circle circle = new Circle(radius);

            System.out.println("Circumference: ");
            System.out.println(circle.getCircumference());
            System.out.println("Area: ");
            System.out.println(circle.getArea());
        }
    }
}


还有两个小点:



import java.lang.Math是不必要的,因为java.lang.*一直都可用。
由于Java 7,try-with-resources为您提供了一种自动关闭像Scanner这样的自动关闭对象的方法。代码或我上面的代码都检查是否存在所有要读取的double。如果输入为垃圾,则将抛出java.util.InputMismatchException,该q4312079q无法处理。


评论


\ $ \ begingroup \ $
啊,所以我没有创建实际的Circle类。我应该以其他方式知道,因为这与C ++中的相同。看来我实际上在使用自由函数。
\ $ \ endgroup \ $
– Jamal♦
2014年7月17日下午0:44

\ $ \ begingroup \ $
我想对于一个受过良好教育和经验的人,由于当时的目的,他们做了他们所做的一切。如果您认为一个人不知道如何做这样的事情,那将是您的错。当需要面向对象和可伸缩时,它将是面向对象的。
\ $ \ endgroup \ $
–通知A
14年7月17日在7:13

#3 楼

我实际上不喜欢将每个标签和结果显示在单独的行上,而是希望将每个值都放在这样的单独行上:





<我发现5.5 Circumference: 34.55751918948772 Area: 95.03317777109123 可以做到这一点,而print()可以换行。 >我还结合了@Simon关于用户输入提示的建议。



 println() 


这样,我得到以下输出(使用相同的半径):




 System.out.print("Input radius: ");

// ...

System.out.println();
System.out.print("Circumference = ");
System.out.println(circle.getCircumference());
System.out.print("Area = ");
System.out.print(circle.getArea());
 



评论


\ $ \ begingroup \ $
从“惯例”的角度来看,我将使用:而不是=。
\ $ \ endgroup \ $
–牙刷
2015年10月8日14:11