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

标签 grails groovy grails-orm

我在 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/

相关文章:

java - ehcache session 范围在 grails 中

spring-mvc - Grails 验证 delete() 操作?

grails - 在运行时将 Gorm 切换到不同的数据源

session - 如何在Grails中唯一标识请求?

grails - 关于disableCNCheck选项的wsdl2java CXF命令行错误

android - 我想在Android的调试和 Release模式下使用其他库

grails - 无法在 Grails 中创建新的域对象

select - 在g.select中填充列表

java - 上传图片时加水印

tsql - 忽略 jdbc 批处理中的错误语句