【问题标题】:Avoid code-duplication while access different classes' static members in Java在 Java 中访问不同类的静态成员时避免代码重复
【发布时间】:2020-11-17 18:57:06
【问题描述】:

我正在编写一个抽象类并有一些子类扩展它。我在子类中有完全相同的方法和相同的实现,我想知道是否有办法避免代码重复。问题是,虽然每个类中的代码完全相同,但它使用了该类的静态变量。有没有办法让方法只写一次(例如在抽象类中)并让方法从当前对象的类类型中访问静态成员“NAME”?

也就是说,有没有办法只实现一次方法getName(),并返回当前类的NAME静态变量?

public abstract class Car {
    public abstract String getName();
}

public class Bus extends car{
    
    private static final String NAME = "Bus a Bus A";
    
    public String getName() {
        return Bus.NAME;
    }
}

public class Taxi extends car{

    private static final String NAME = "TAXiiii";

    public String getName() {
        return Taxi.NAME;
    }
}

public class Motor extends car{

    private static final String NAME = "motor hehe";

    public String getName() {
        return Motor.NAME;
    }
}

【问题讨论】:

  • 您可以通过简单地删除静态最终字段来避免代码重复。只需执行public String getName() { return "Bus a Bus A"; }。具有相同名称的静态字段不能以任何合理的方式重用(即它们没有任何有意义的名称相关,就像私有方法一样)。
  • Java 6?真的吗?

标签: java oop java-6


【解决方案1】:

为什么不简单地将名称传递给超级构造函数?尽管这消除了将 Car 变为 abstract 的需要,因为您可以简单地从其 getName 方法中返回名称。

public class Car {
    private final String name;
    
    public Car(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Bus extends Car {

    private static final String NAME = "Bus a Bus A";

    public Bus() {
        super(NAME);
    }
}

public class Taxi extends Car {

    private static final String NAME = "TAXiiii";

    public Taxi() {
        super(NAME);
    }
}


public class Motor extends Car {

    private static final String NAME = "motor hehe";

    public Motor() {
        super(NAME);
    }
}

【讨论】:

  • 问题在于,将上层类作为抽象类是有意义的,而现在所有的类都没有构造函数,因为没有必要。
  • 如果您的子类实现不同的功能,您只需要一个抽象类。在您的示例中,您将使用 Car c = new Bus(); c.getName(); 之类的类。当您像我的示例中那样将公共代码移动到父类时,代码和行为不会改变。相反,您获得的是更多的可维护性,因为您只需要更改一个地方(父类)而不是多个类(所有子类)
  • 我现在明白你的意思了。你的建议唯一困扰我的是 NAME 作为汽车的数据成员而不是静态成员,尽管它可以而且应该是静态的
  • 如果Car 有一个名为static 的成员NAME,那么对于Car 的所有实例来说,它的值都是相同的。为什么它会打扰你?为什么它应该是静态的?在您的示例中,汽车的名称取决于其子实现,因此它不能是 static
  • 你需要子类吗?这可能是“偏好组合优于继承”的一个例子......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2015-03-17
  • 2018-10-05
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
相关资源
最近更新 更多