我正在创建一个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
对象上。 bmr
是int
,所以没有名为calcBMR
的方法
是否使用this
取决于您的偏好。只有拥有一个也称为bmr
的局部变量,然后显式调用实例变量而不是局部变量,这才真正有所作为。通常,具有相同名称的局部变量和实例变量会令人困惑。
但是,您的calcTDEE
方法有点过时。您可以只使用bmr
的值,而不传入或重新计算它,因此
public int calcTDEE() {
return (int) Math.round(bmr * activityMultiplier);
}
关于java - Java与构造函数中传递的参数混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32388791/