抽象类应同时具有抽象方法和具体方法

发布时间:2020-07-06 18:25

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修改为一个具体的类,因此我无法将其扩展为实现继承。我在做什么是不好的做法?

回答1

来自文档

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

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

->您在这里。因此,这就是声纳显示此规则违反的原因。

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

回答2
<块引用>

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

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

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

public class Person {

protected Person() { }