代码之家  ›  专栏  ›  技术社区  ›  Tweety B

房间:相关实体-可用公共构造函数

  •  5
  • Tweety B  · 技术社区  · 7 年前

    @Relation 变量

    data class SubjectView(
        @Embedded
        var subject: Subject,
    
        @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class)
        var topics: List<Topic>?
    )
    

    但是在编译时我有一个错误

     error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type)
    [...]
    Tried the following constructors but they failed to match:
    SubjectView(biz.eventually.atpl.data.db.Subject,java.util.List<biz.eventually.atpl.data.db.Topic>) : [subject : subject, topics : null]
    

    嗯,那个构造器 [主题:主题,主题:空] 看起来不错吧???

    然而,如果我在没有参数构造函数和全参数构造函数的情况下更改我的类,它确实可以工作。

    class SubjectView() {
        @Embedded
        var subject: Subject = Subject(-1, -1, "")
    
        @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class)
        var topics: List<Topic>? = null
    
        constructor(subject: Subject, topics: List<Topic>?) : this() {
            this.subject = subject
            this.topics = topics
        }
    }
    

    我想知道为什么第一个(更快的)版本没有编译,因为它不是如文档所示。

    不过,构造函数(数据)类中所有变量的默认参数(正如我在其他帖子中看到的)似乎不是强制性的?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  5
  •   Emanuel    7 年前

    有几个主题是关于数据类如何生成构造函数的。

    由于构造函数中有一个可为null的对象,因此它将生成所有可能的构造函数。这意味着它会产生

    constructor(var subject: Subject)
    constructor(var subject: Subject, var topics: List<Topic>) 
    

    有两种方法可以解决这个问题。第一种方法是预定义所有值,如,并使用所需的构造函数创建另一个被忽略的构造函数。

    data class SubjectView(
        @Embedded
        var subject: Subject,
    
        @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class)
        var topics: List<Topic> = ArrayList()
    ) {
     @Ignore constructor(var subject: Subject) : this(subject, ArrayList())
    }
    

    另一种方法是创建一个半填充的数据类,如

    data class SubjectView(@Embedded var subject: Subject) {
        @Relation var topics: List<Topic> = ArrayList()
    }
    

    请注意,第一个解决方案是正确的解决方案,您需要将@Ignore设置为任何其他构造函数。