Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类应该有抽象和具体的方法解决方法_Java_Inheritance_Sonarqube - Fatal编程技术网

Java 抽象类应该有抽象和具体的方法解决方法

Java 抽象类应该有抽象和具体的方法解决方法,java,inheritance,sonarqube,Java,Inheritance,Sonarqube,SonarQube给了我一个错误:抽象类应该有抽象和具体的方法: public abstract class Person { protected String emailAddress; protected String firstName; protected String lastName; protected Timestamp createdDate; // public getters and setters 我使用这个类来实现对这个DTO的继承 public class Fa

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修改为具有私有构造函数的具体类,那么我就不能将其扩展到实现继承。我所做的是不好的实践?

来自文档

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

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

->你来了。所以这就是为什么声纳显示这个规则是违反的

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

声纳说要把人改造成一个具体的阶级和私人 建造师

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

在您的例子中,我建议您删除abstract关键字,并向Person类添加一个受保护的构造函数。希望这样你能让Sonar开心

public class Person {

protected Person() { }

好吧,但是根据文档,它应该是一个带有私有构造函数的具体类,这意味着我不能将它扩展到我的DTO。那你怎么看呢。这可能只是一个普通的课程吗?你是在假设还是在尝试改变。。。。IDE会让你知道用私有构造函数扩展类是否可行。是的,我这样做了,但IntelliJ告诉我:“com.dtos.Person”中没有默认的构造函数,所以这就是为什么我有点混乱的原因。是的,如果你加上类似这样的内容:隐式超级构造函数super是不可见的。必须显式调用另一个构造函数。这意味着您需要添加一些参数化构造函数。好吧,但我不明白的是,如果我有一个带参数的构造函数,那么为什么我要这样做,而不是一路公开构造函数?继承对于代码重用来说是一个糟糕的工具。这可能是一个更喜欢组合而不是继承的时候。