当前位置: 首页 > 知识库问答 >
问题:

强制子类初始化超类的属性

谢灵均
2023-03-14

我有一份抽象的课堂报告:

@NoArgsConstructor
@Data
public abstract class Report {
    private String surrogateId;
.
.
.

我需要强制所有子类填充此 surrogateId 属性。(如果子类未填充属性,则会出现编译错误)

@Data
@Document(collection = "active_report")
@NoArgsConstructor
public class ReportActiveDevicesNotLinkedWithIO extends Report {
    private String active;
.
.
.
}

我尝试使用 final 关键字来强制我在构造函数中引入此属性的值,但我必须手动生成构造函数而不是使用 Lombok,很多样板代码。有没有办法在不手动生成结构的情况下实现相同的期望。

共有1个答案

年凯康
2023-03-14

Lombok不支持生成考虑超类型属性的代码。这是因为这样做比听起来要复杂得多,有关原因的详细信息,请参阅lombok网站上的这篇wiki帖子。

因此,您想要的(我希望子类设置此属性,但也希望最大样板破坏)目前是不可能的,而且在不久的将来也不太可能实现。

您可以做的最好是使字段为最终字段,在超类上使用@RequiredArgsConstructor,然后手写子类的构造函数。

 类似资料:
  • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?

  • 问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。

  • 问题内容: 我正在尝试创建UIBezierPath的子类,以添加一些对我有用的属性。 编辑:我需要这个,因为在我的代码中我写 并导致编译错误: “必须调用超类’UIBezierPath’的指定初始化程序” 我试图在子类中添加该初始化器,但似乎不起作用。 你能帮我吗? 问题答案: 注意 :此问题已在iOS 9中得以解决,在该版本中,API已被重写为存在,其他所有(方便初始化程序)也是如此。 问题 简

  • 问题内容: 在Python中,请考虑以下代码: 如何在子类中初始化?我正在关注Python教程,但没有涵盖。当我在Google上搜索时,发现了不止一种方法。处理此问题的标准方法是什么? 问题答案: Python(直到第3版)支持“旧式”和新式类。新样式类派生自您使用的类,并通过调用它们的基类,例如 因为python了解旧样式和新样式的类,所以有不同的方法可以调用基本方法,这就是为什么您找到了多种方

  • 问题内容: 定义 类属性和 初始化 它们之间有区别吗?在某些情况下,您想彼此做一个吗? 例: 以下代码段应指出我的意思。我在那里使用一个原语和一个对象: 与 问题答案: 首先,您不能将原语设置为null,因为原语只是数据,其中是对象引用。如果尝试编译,则会收到不兼容的类型错误。 其次,像在Java中那样,在类中将变量初始化为或在类中声明变量时是多余的,原语默认为(或),对象引用默认为。局部变量不是

  • 问题内容: 在php中声明属性时,为什么无法将属性初始化为函数?以下代码片段导致 解析错误:语法错误,意外的T_FUNCTION 您还可以将属性初始化为字符串,数字或其他数据类型吗? 编辑: 但是我可以在__construct()方法中将函数分配给属性。以下工作正常: 问题答案: 因为它不是用PHP实现的。 http://www.php.net/manual/zh/language.oop5.pr