【问题标题】:An abstract class should have both abstract and concrete methods workaround抽象类应该同时具有抽象方法和具体方法的解决方法
【发布时间】:2020-07-06 18:25:47
【问题描述】:

SonarQube 给我这个错误:“一个抽象类应该有抽象和具体的方法”这个类:

public abstract class Person {

protected String emailAddress;
protected String firstName;
protected String lastName;
protected Timestamp createdDate;

// public getters and setters

我使用这个类来实现对这个 DTO 的继承

public class FacultyDTO extends Person implements Serializable {

private static final long serialVersionUID = 1L;

private Integer userId;

private Integer clientId;

private String status;

// getters and setters for fields above

public class StudentDTO extends Person implements Serializable {

private static final long serialVersionUID = 1L;

private Integer studentId;

// getters and setters for fields above

但是 Sonar 说要将 Person 修改为具有私有构造函数的具体类,这样我就无法将其扩展为实现继承。我在做什么是不好的做法?

【问题讨论】:

  • 继承对于代码重用来说是一个糟糕的工具。这可能是一个更喜欢组合而不是继承的时候。

标签: java inheritance sonarqube


【解决方案1】:

来自文档

抽象类的目的是提供一些可继承的行为,同时定义必须由子类实现的方法。

一个没有抽象方法的类,纯粹是为了防止实例化而被抽象化,应该转换为一个带有私有构造函数的具体类(即删除 abstract 关键字)。

--> 你来了。所以这就是声纳显示此规则违反的原因。

只有抽象方法且没有可继承行为的类应转换为接口。

【讨论】:

  • 好吧,但是根据文档,它应该是一个带有私有构造函数的具体类,这意味着我无法将它扩展到我的 DTO。所以,对于这个你有什么想法。难道这只是普通的课?
  • 您是否假设或尝试过进行更改.... IDE 会通知您是否可以使用私有构造函数扩展类。
  • 是的,我这样做了,但 IntelliJ 告诉我:“'com.dtos.Person' 中没有可用的默认构造函数”,所以这就是我有点无能的原因
  • 是的,如果你添加了类似这样的东西:隐式超级构造函数 Super() 不可见。必须显式调用另一个构造函数。这意味着您需要添加一些参数化的构造函数。
  • 好吧,但我不明白的是,如果我有这个带参数的构造函数,那我为什么要这样做而不是一直把构造函数公开呢?
【解决方案2】:

Sonar 说将 Person 修改为具有私有的具体类 构造函数

这听起来很愚蠢。谁愿意只用私有构造函数声明一个具体类?好吧,除非你只做单例/静态之类的事情,这里不是这种情况。

在您的情况下,我建议删除 abstract 关键字并将受保护的构造函数添加到您的 Person 类。这样你就可以让 Sonar 开心了,希望如此。

public class Person {

protected Person() { }

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 2013-05-16
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多