我有一种情况,我需要确定一个对象是否有资格“骑”另一个对象。车辆的规则非常混乱,我希望能够在不重新启动或重新编译我的项目的情况下更改它们。
这行得通,但基本上让我的安全朋友抽搐并说方言:
class SweetRider{
String stuff
BigDecimal someNumber
BigDecimal anotherNumber
}
class SweetVehicle{
static hasMany=[constraintLinkers:VehicleConstraintLinker]
String vehicleName
Boolean canIRideIt(SweetRider checkRider){
def checkList = VehicleConstraintLinker.findAllByVehicle(this)
checkList.each{
def theClosureObject = it.closureConstraint
def iThinkINeedAShell = new GroovyShell()
def checkerThing = iThinkINeedAShell.evaluate(theClosureObject.closureText)
def result = checkerThing(checkRider)
return result
}
}
}
class VehicleConstraintLinker{
static belongsTo = [closureConstraint:ConstraintByClosure, vehicle:SweetVehicle]
}
class ConstraintByClosure{
String humanReadable
String closureText
static hasMany = [vehicleLinkers:VehicleConstraintLinker]
}
因此,如果我想添加规则,如果您的“stuff”是“peggy”或“waffles”并且您的 someNumber 大于您的 anotherNumber,那么您只有资格使用特定车辆,我所要做的就是:
使用 humanReadable = "peggy waffle some#>" (这是人类可读的解释)创建一个新的 ConstraintByClosure,然后将此字符串添加为closureText
{
checkRider->if(
["peggy","waffles"].contains(checkRider.stuff) &&
checkRider.someNumber > checkRider.anotherNumber ) {
return true
}
else {
return false
}
}
然后我只是制作了一个 VehicleConstraintLinker 来链接它,瞧。
我的问题是:有什么方法可以限制 GroovyShell 的功能吗?我可以让它无法更改任何文件、全局变量或数据库数据吗?这足够了吗?