如何在不使用继承/获取/反射的情况下比较不同类的私有成员变量?

时间:2018-07-11 20:03:08

标签: java interface composition

我不得不用相似的成员变量和方法创建两个不同的类,除了其中两个没有的方法。因此,我决定将一个不完整类的实例创建到另一个类中,以免出现重复的代码。

所以它们看起来像这样:

public class Beast{
    private int speed;
    //other variables & methods
    ...    
}

public class Hero{
    private int speed;
    //other variables
    ...
    Beast beast = new Beast();
    ...
}

我如何比较speed实例的Beast变量和Hero实例的变量而不在两个类,获取器或反射类之间使用任何形式的继承? (也许接口会帮助我,因为我仍处于早期Java学习阶段,所以我不知道)

4 个答案:

答案 0 :(得分:1)

如果这只是一个难题,可以通过以下几种方法来实现,而无需继承,获取或反思。

  1. 嵌套类可以访问其封闭类的私有变量,以及同一范围内的其他嵌套类。

    class Outer {
        public static class Hero { private int speed; }
        public static class Beast { private int speed; }
    }
    

    在该示例中,HeroBeast现在可以访问彼此的私有speed变量。这意味着Hero类只能执行this.speed == aBeast.speed,或者就是您想比较。

  2. 使用参数传递。

    public class Beast {
        private int speed;
    
        public boolean isSpeedEqualTo(int speed) {
            return this.speed == speed;
        }
    }
    

    然后例如Hero可以说aBeast.isSpeedEqualTo(this.speed)

但是,使用getters更有意义,并且似乎speed变量也应该在HeroBeast都扩展的超类中声明。

答案 1 :(得分:0)

如果未在组合类中提供吸气剂,则无法比较这些不同类的实例的points = points.redim.range(data=(-0.2, 1))字段。

不作反思,您可以有两种选择:

  • 创建字段private,这通常是不好的做法
  • public中引入了一种比较方法来比较速度并提供其他类中的吸气剂。您无需在Hero中提供getter,因为可以在类的实例方法中访问私有字段。

第二种方式可能是:

Hero

您现在可以做:

public class Beast{    
   private int speed;

   public Beast(int speed){
     ...
   }
   public int getSpeed(){
     return speed;
  }
}

public class Hero {    
   private int speed;
   private Beast beast;

   public Hero (int speed, Beast beast){
     ...
   }

   // just an example to use speed from the both instances
   public boolean isMoreFast(){
     return speed > beast.getSpeed();
   }

}

答案 2 :(得分:0)

我相信,没有继承,获取者或反思,您将无法做到这一点。

声明私有变量时,只能在其自己的类中直接访问该变量。

以下oracle文档:

  

本着封装的精神,通常将字段设为私有。这意味着只能从Bicycle类直接访问它们。但是,我们仍然需要访问这些值。可以通过间接添加公共方法来完成,这些方法可以为我们获取字段值。

Oracle文档:Java Access Modifiers

答案 3 :(得分:-1)

在int之前使用static关键字。

静态int速度。

借助static关键字,您无需创建类的对象,就可以像

一样访问它

ClassName。变量名称