我无法访问Java中相同类型的私有成员。 我正在分数类型上创建方法“添加”,但无法访问其他分数私有变量进行比较。
public Fraction add(Fraction f) {
int add1 = (this.numerator*f.denominator)+(this.denominator*f.numerator);
int add2 = this.denominator*f.denominator;
return createFraction(add1,add2);
}
我是否应该使用某种反射功能来实现这一目标?
其他信息:我尚未在界面上声明私有成员。
其他信息:我不允许在此类上使用吸气剂和吸气剂
其他信息:我不允许公开这些字段
答案 0 :(得分:2)
您应该在Fraction
类上创建getter和setter,以便可以获取和设置私有变量的值。
public class Fraction{
private int numerator;
private int denominator;
public Fraction(final int numerator, final int denominator){
this.numerator = numerator;
this.denominator = denominator;
}
public int getNumerator(){
return this.numerator;
}
public int getDenominator(){
return this.denominator;
}
public void setNumerator(final int numerator){
this.numerator = numerator;
}
public void setDenominator(final int denominator){
this.denominator = denominator;
}
}
然后您可以将代码更改为此:
public Fraction add(Fraction f) {
int add1 = (this.numerator*f.getDenominator())+(this.denominator*f.getNumerator());
int add2 = this.denominator*f.getDenominator();
return createFraction(add1,add2); //createFraction can be simply new Fraction(add1, add2);
}
您可以通过使用Field.setAccessible
来使用Reflection来获取字段的值,但是为该字段编写getter更加容易和清洁。
示例用法:
Field field = f.getClass().getDeclaredField("numerator");
f.setAccessible(true);
int numerator = (int) field.get(f);
您的代码然后可以更改为:
public Fraction add(Fraction f) throws NoSuchFieldException, IllegalAccessException{
Field fieldNumerator = f.getClass().getDeclaredField("numerator");
fieldNumerator.setAccessible(true);
Field fieldDenominator = f.getClass().getDeclaredField("denominator");
fieldDenominator.setAccessible(true);
final int numerator = (int) fieldNumerator.get(f);
final int denominator = (int) fieldDenominator.get(f);
int add1 = (this.numerator*denominator)+(this.denominator*numerator);
int add2 = this.denominator*denominator;
return createFraction(add1,add2);
}