0

这是我的域类定义:

class Profile {
           PhotoAlbum photoAlbum

           static constraints = {
               photoAlbum(nullable:true)
           }
}

class PhotoAlbum {

        static hasMany = [photos:Photo]
        static belongsTo = [profile:Profile]

}

class Photo {
       static belongsTo = PhotoAlbum
}

在控制器中,我将拥有一个实例化的配置文件域。该域以空 photoAlbum 开始。如果我想添加第一张照片,我会在 photoAlbum 上得到一个空指针异常:

Photo photo = new Photo()

profile.photoAlbum.addToPhotos(photo)

这样做并避免空指针异常的grailsy方法是什么:

Photo photo = new Photo()

if (!profile.photoAlbum) { profile.photoAlbum = new PhotoAlbum) }

profile.photoAlbum.addToPhotos(photo)

我会认为如果 photoAlbum 为空,当我尝试向其添加第一个照片对象时,grails 只会创建一个新对象。虽然上面的 3 行代码可以工作,但我想知道是否有更好的方法可以在 2 行代码中完成同样的事情。

4

1 回答 1

0

您可以覆盖 in 的 getter 以PhotoAlbum按需Profile创建专辑:

class Profile {
    ...
    PhotoAlbum getPhotoAlbum() {
        if (photoAlbum == null) {
            photoAlbum = new PhotoAlbum()
        }
        photoAlbum
    }
}

然后,当您调用 时profile.photoAlbum,它将按照您的预期自动创建。但是,每当调用 getter 时,这将创建空专辑,这可能不是您想要的。我会让它更明确,像这样:

class Profile {
    ...
    PhotoAlbum createOrGetPhotoAlbum() {
        if (photoAlbum == null) {
            photoAlbum = new PhotoAlbum()
        }
        photoAlbum
    }
}

并这样称呼它:profile.createOrGetPhotoAlbum().addToPhotos(photo)

于 2013-10-29T16:29:55.507 回答