如何避免静态方法的冗余代码

时间:2016-10-21 09:25:14

标签: java oop static abstract

我们假设我有以下课程:

public abstract class Animal {
    protected final String noise;

    public Animal(String noise) {
        this.noise = noise;
    }      

    public void makeNoise() {
        System.out.println(noise);
    }
}

public class Dog extends Animal{
    public Dog(){
        super("woof");
    }
}

如您所见,这两个类共享几乎相同的代码。要删除冗余代码,我要创建一个像这样的父类:

public function get_detail_activity()
{
    $status= $this->activity();//call function model activity
    $query=$this->db->query("SELECT 
          t_trx_activity.activity_id FROM t_trx_activity
          JOIN t_trx_activity_detail ON
          t_trx_activity_detail.activity_id =t_trx_activity.activity_id
          WHERE t_trx_activity.activity_id = '".$status."'");
    if($query->num_rows()>0)
    {
        return $query->result_array();
    }
    else
    {
        return array();
    }
}


 public function activity()
 {
     $query=$this->db->query("SELECT t_trx_activity.activity_id
         FROM t_trx_activity
         ORDER BY
         t_trx_activity.activity_id DESC LIMIT 1");
         $nik=$this->session->userdata('nik');

     if($query->num_rows()>0)
     {
         return $query->row()->activity_id;
     }
     else
     {
         return 0;
     }
 }

现在不幸的是我遇到了两个问题:

  1. 因为动物的噪音不再是静止的,所以作为常数 必须通过动物的构造者分配,你会 需要创造一只猫或狗来获得那种动物的噪音。甚至 虽然它是一个常数。
  2. 方法makeNoise()需要在Animal类中工作 - 哪个 每个默认情况下都会产生噪音。
  3. 可能的解决方案就是这样:         public abstract void makeNoise(); 这既不被允许,也不会消除将代码复制到Animal的每个人和每个人的需要。

    如何在保持方法makeNoise静态的同时消除动物子代中冗余代码的需要?

2 个答案:

答案 0 :(得分:1)

Java中的静态方法无法在子类中重写。

如果在子类中使用与父类中的静态方法相同的签名定义静态方法,则该方法不会覆盖父方法隐藏它。父类和子类中的方法彼此无关。

在您的示例中,如果static void makeNoise()中存在方法Animal,并且任何子类也定义了该方法,则子类只是将makeNoise方法隐藏在Animal中。

在您的示例中,您可以使用静态方法执行的最佳操作是:

public static void makeNoise(String noise) {
    System.out.println(noise);
}

以这种方式调用方法:

Animal.makeNoise(Cat.NOISE); // A constant NOISE is defined in each subclass

如果方法makeNoise是非静态的,则可以使用继承在每个子类中使用不同的噪声:

public abstract class Animal {
    protected String noise;

    protected Animal(String noise) {
        this.noise = noise;
    }

    public void makeNoise() {
        System.out.println(noise);
    }

}

public class Cat extends Animal{
    public static final String NOISE = "meow";

    public Cat() {
        super(NOISE);
    }
}

答案 1 :(得分:0)

为什么用静态方法表示真实世界的对象行为?每只动物都有它自己的行为,所以你想要区分它们。

 enum AnimalBehavior {
    MEOW, WOOF, ROAR
}

您可以使用包含每种动物行为的枚举。 还要考虑以下情况:狼在满月之夜嚎叫。他一直这样做,直到他筋疲力尽。你想跟踪一个指示狼的能量水平的条形码。

private int energy = 100;

public static void wolfHowl() {
    System.out.println(AnimalBehavior.ROAR);
    energy = energy - 10;
}

这在技术上不会起作用,因为你正在使用静态方法..所以请记住你如何设计你的东西,因为狼实际上可以嚎叫而不会累,直到有人真的生气。