gpt4 book ai didi

grails - Groovy/Grails 如何使构造函数私有(private) - 正确的方法

转载 作者:行者123 更新时间:2023-12-02 14:56:52 26 4
gpt4 key购买 nike

我在 grails 中有一个域类,应该只用相同的名称创建一次。为了确保我有一个静态方法 getColor 和私有(private)构造函数,如下所示:

class Color {
String name

static hasMany = [moods: Mood]

// not accessible
private Color() {}

// not accessible because getColor should be used
private Color(String name) {
this.name = name
}

static getColor(String name) {
def color = Color.findByName(name.toLowerCase())
color ? color : new Color(name).save(flush:true)
}

def beforeValidate() {
name = name.toLowerCase();
}
}

为了确保仅使用静态 getColor 方法创建 Color 对象,我想将构造函数设为私有(private)。到目前为止,它工作得很好,我可以创建颜色对象。但是当我使用这个实例来创建 Object Mood 的对象时
class Mood {

static belongsTo = [color:Color]

}

def color = Color.getColor('verylightgreen')
def mood = new Mood(color: color)

我得到一个异常(exception):
error initializing the application: Could not instantiate bean class [de.tobi.app.Color]: Is the constructor accessible?

此异常由
def mood = new Mood(color: color)

那么为什么创建 Mood 需要访问 Color 的构造函数。我已经通过了对象..
通常,在 groovy/grails 中隐藏域类的构造器以控制对象的创建方式的最佳方法是什么。特别是 map Controller 的使用也应该被禁用。

最佳答案

使用 name作为 Color 的主键你可以实现独特性。另外,findOrSaveBy*可用于替换自定义静态方法getColor .

如果制作name主键不是一个可行的选择,那么您可以继续添加几乎所有个人在对该问题的评论中提到的约束。 :)

class Color {
String name

static mapping = {
//column is optional
id name: 'name', generator: 'assigned', type: 'string', column: 'NAME'
}

static hasMany = [moods : Mood] //for example

//DO NOT NEED THIS
//This can be achieved by findOrSaveBy*
/*static getColor(String name) {
def color = Color.findByName(name.toLowerCase())
color ? color : new Color(name).save(flush:true)
}*/

def beforeValidate() {
name = name.toLowerCase();
}
}

那么你可以很好地做到
def color = Color.findOrSaveByName('verylightgreen')
def mood = new Mood()

color.addToMoods(mood)
color.save()

关于grails - Groovy/Grails 如何使构造函数私有(private) - 正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18278272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com