我正在创建一个BMR计算器,并且有一个名为User的类。此类包含用于计算BMR的所有方法,以及将用户数据(年龄,性别,体重,身高)打包在一起的构造函数。

代码是:

public class User {

int age;
String gender; // todo: use an Enum
double height; // height stored in cm, weight in kg (so if user enters in feet/lbs, conversions are done to cm/kg and *THEN* passed through to constructor below)
double weight;
double activityMultiplier; // todo: use an Enum  (possibly)
int bmr;


public User(int age, String gender, double height, double weight,
    double activityMultiplier) {
    this.age = age;
    this.gender = gender;
    this.height = height;
    this.weight = weight;
    this.activityMultiplier = activityMultiplier;

    bmr = calcBMR();
}

/**
 * If user input is correct, this method will calculate the BMR value of the user given their input and measurement choices.
 *
 * @param None
 * @return BMR Value
 */
public int calcBMR() {
    int offset = gender.equals("M") ? 5 : -161;
    // This is the body of the calculations - different offset used depending on gender. Conversions to kg and cm done earlier so no conversions needed here.
    // The formula for male and female is similar - only the offset is different.
    return (int) (Math.round((10 * weight) + (6.25 * height) - (5 * age) + offset)); // This is the Miffin St-Jeor formula, calculations done in cm/kg
    }

/**
 * If the user selects the TDEE option, this method will be executed after the calcBMR() method.
 * A value from the calcBMR() method will be passed down to this method, and is multiplied
 * by the activity level parameter passed into this method.
 *
 * @param bmr (output from calcBMR() method
 * @return TDEE Value
 */
public int calcTDEE(int bmr) {
    return (int) Math.round(calcBMR() * activityMultiplier);
}

}


我担心的是,我不确定在构造函数(bmr = calcBMR())中初始化bmr值的方式是否正确。在记录用户的年龄,性别,身高和体重并将其存储在变量中之前,我无法计算bmr(以上5行内容就是如此)。这种编程结构可以吗?即创建User对象时,年龄,性别,身高和体重存储在变量中,然后在构造函数中调用一个方法来计算和存储另一个值。

有一个更好的方法吗?如果不是,我需要做this.bmr = calcBMR()还是bmr = calcBMR()没问题?

注意User对象是在单独的类中创建的。我主要感到困惑的原因是因为我没有将bmr参数传递给构造函数,而是使用方法返回值来初始化实例变量的值。

最佳答案

语法上可以,但是您不应从构造函数中调用可重写的方法(公共/受保护的非最终方法)。如果有人重写它,则可能会弄乱对象的构造。从构造函数调用帮助程序方法很好,只需使其私有或最终即可。

this.bmr = calcBMR()
bmr = calcBMR()

bmr.calcBMR()毫无意义,因为calcBMR方法位于User对象上。 bmrint,所以没有名为calcBMR的方法

是否使用this取决于您的偏好。只有拥有一个也称为bmr的局部变量,然后显式调用实例变量而不是局部变量,这才真正有所作为。通常,具有相同名称的局部变量和实例变量会令人困惑。

但是,您的calcTDEE方法有点过时。您可以只使用bmr的值,而不传入或重新计算它,因此

public int calcTDEE() {
    return (int) Math.round(bmr * activityMultiplier);
}

关于java - Java与构造函数中传递的参数混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32388791/

10-13 05:09