我的域名中有很多'描述'属性。这些可能会很长。我想将描述的前n个字符放入域类的toString()中。大。但是在执行期间,如果字符串是< n在一个propertName.substring(0,n) - 它吹一个垫片 - 索引超出范围。
问:我最有效的解决方法是什么?考虑添加域类属性方法或字符串类方法,smartSubString(start,end,ifNullOrEmpty)如果长度为<将返回完整长度。结束,如果它为空或为null,则返回第3个可选参数中指定的内容,默认为空字符串。我将非常感谢其他建议和细节,如何放置此方法,如什么文件夹,以及如何将其包含在grails中。
谢谢!
答案 0 :(得分:2)
String.metaClass.subStringWithDefault = {init, last, defaultVal = null ->
delegate ? delegate[init..(delegate.size() > last ? last : -1)] : defaultVal
}
def string = 'This is a test String'
assert string.subStringWithDefault(0, 5, 'default') == 'This i'
assert string.subStringWithDefault(0, 50,'default') == 'This is a test String'
assert string.subStringWithDefault(7, 50,'default') == ' a test String'
assert string.subStringWithDefault(7, 50) == ' a test String'
assert string.subStringWithDefault(7, 10,'default') == ' a t'
assert ''.subStringWithDefault(0, 50,'default') == 'default'
我会将此实用程序作为src/groovy
类的一部分放在StringUtils
中,并在Bootstrap中启动。
//src/groovy
class StringUtils {
static initUtils(){
smartSubString()
}
static smartSubString() {
String.metaClass.subStringWithDefault = {init, last, defaultVal = null ->
delegate ? delegate[init..(delegate.size() > last ? last : -1)] :
defaultVal
}
}
}
//BootStrap
import static com.example.mypackage.StringUtils
def init = {
initUtils()
}
答案 1 :(得分:1)
我将这样的方法放在src / groovy中的实用程序类中:
package com.foo.bar
class Utils {
static String safeSubstring(String s, int maxLength) {
s ? s[0..(Math.min(maxLength - 1, x.length() - 1))] : ''
}
}
并在域类中将其称为
import com.foo.bar.Utils
...
String toString() {
Utils.safeSubstring propertyName, 5
}