【问题标题】:extending a class from an abstract class in java? [closed]从java中的抽象类扩展一个类? [关闭]
【发布时间】:2014-01-27 10:11:07
【问题描述】:

我有下面的java抽象类。

public abstract class Base implements Serializable {


    private static final long serialVersionUID = 2602178514139825116L;

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


}

MainRequest.java

public class MainRequest extends Base {

    te static final long serialVersionUID = -1724534962722346709L;


    private String key;
    private String name;


    public MainRequest(String id){
        super.setId(id);
    }

    public MainRequest(String key, String name){
        this.key = key;
        this.name = name;
    }

    public String getKey() {
        return key;
    }


    public String getName() {
        return name;
    }


}

我的MainRequest .java 课程正确吗?我还需要调用超类构造函数吗? MainRequest.java 有什么改进吗?

谢谢!

【问题讨论】:

  • 您是否看到任何编译错误(除了在MainRequest 中您有te 而不是private)?
  • 不...我只是要求任何改进..
  • 那么更好的地方是codereview
  • 可能为所有属性(id、key、name)添加构造函数。不管怎样,你的课看起来不错。
  • 这个问题似乎是题外话,因为它是关于代码审查,而不是具体问题。

标签: java java-ee-7


【解决方案1】:

对于这种情况Base 不需要是abstract 类,使用interface 就足够了。

【讨论】:

  • 如果所有扩展Base 的类都需要有id 属性怎么办?在那种情况下,abstract 类是正确的决定。
  • Ruchira,Base 将扩展至少 10 个子类...
【解决方案2】:

在 MainRequest(String key, String name) 构造函数中,不需要使用 super() 构造函数。 您没有使用默认构造函数 MainRequest(){ },因此 jre 有责任在参数化构造函数中提供 super()。 你使用了可序列化的接口,它没有抽象方法,所以在实现这个接口时,定义那个接口的抽象方法并不麻烦。因为,它什么都没有。 (称为标记接口,目的是在 IO 操作时完成某些任务)。如果在参数构造函数中不传递 id 值,则 jre 将采用 int 的默认值。默认值为 0。有什么问题吗?

【讨论】:

    【解决方案3】:

    改进将是:

    • 实现像Base(String id) 这样的构造函数并从MainRequest 类中调用它,因此Base 的每个子类都必须有一个id 值。

      public Base(String id) {
          this.id = id;
      }
      
    • 考虑在Base 类中的id 成员变量上使用final,并删除setId 方法。在大多数情况下,您真的不想设置 id 两次,是吗?

      private final String id;
      
    • 创建一个像MainRequest(String id, String key, String name) 这样的构造函数来一次设置所有的东西,比如:

      public MainRequest(String id, String key, String name) {
          super(id);
          this.key = key;
          this.name = name;
      }
      
    • 使用abstract 类很好,因为您正在实现getId 方法并且有一个构造函数,但根本不想实例化这个基类。
    • 可以在keyname 成员上添加final 关键字,如果您只想在构造函数中设置这些变量一次(假设,因为您已经没有setter 方法):

      private final String key;
      private final String name;
      
    • 在您的问题中发布工作代码(请参阅te => private

    • 把问题发给https://codereview.stackexchange.com/ :)

    当然,有些点取决于你真正想做的事!但是你没有说出你的意图的一些细节!

    【讨论】:

      【解决方案4】:

      有一件事看起来很奇怪。如果你的晚餐班有 id 属性,它似乎对所有辣椒都是有用的。所以没有它创建一个子类是不好的。所以也将它添加到其他构造函数中:

      public MainRequest(String id, String key, String name){
          super.setId(id);
          this.key = key;
          this.name = name;
      }
      

      【讨论】:

        【解决方案5】:

        您为什么将 Class Base 设为抽象? 由于您没有任何抽象方法,因此该类不需要是抽象的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-08
          • 1970-01-01
          • 2019-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多