【发布时间】:2023-03-13 02:25:01
【问题描述】:
我正在尝试DRY 我的代码,我第一次使用traits 来增强我的enums。
我想要做的是:对于给定的字符串数组,找到与至少一个关键字匹配的所有枚举(不区分大小写)
下面的代码似乎运行良好,但我认为当方法 getSymbolFromIndustries 被调用数千次时它会产生内存泄漏。
这是运行大约 10 分钟后从 VisualVM 捕获的内容,Live Objects 列在每次快照后总是增加,与第二行相比,项目的数量是如此巨大......
特点:
trait BasedOnCategories {
String[] categories
static getSymbolFromIndustries(Collection<String> candidates) {
values().findAll {
value -> !value.categories.findAll {
categorie -> candidates.any {
candidate -> categorie.equalsIgnoreCase(candidate)
}
}
.unique()
.isEmpty()
}
}
}
我实现trait的多个枚举之一
enum KTC implements BasedOnCategories, BasedOnValues {
KTC_01([
'industries': ['Artificial Intelligence','Machine Learning','Intelligent Systems','Natural Language Processing','Predictive Analytics','Google Glass','Image Recognition', 'Apps' ],
'keywords': ['AI','Voice recognition']
]),
// ... more values
KTC_43 ([
'industries': ['Fuel','Oil and Gas','Fossil Fuels'],
'keywords': ['Petroleum','Oil','Petrochemicals','Hydrocarbon','Refining']
]),
// ... more values
KTC_60([
'industries': ['App Discovery','Apps','Consumer Applications','Enterprise Applications','Mobile Apps','Reading Apps','Web Apps','App Marketing','Application Performance Management', 'Apps' ],
'keywords': ['App','Application']
])
KTC(value) {
this.categories = value.industries
this.keywords = value.keywords
}
我的数据驱动测试
def "GetKTCsFromIndustries"(Collection<String> actual, Enum[] expected) {
expect:
assert expected == KTC.getSymbolFromIndustries(actual)
where:
actual | expected
[ 'Oil and Gas' ] | [KTC.KTC_43]
[ 'oil and gas' ] | [KTC.KTC_43]
[ 'oil and gas', 'Fossil Fuels' ] | [KTC.KTC_43]
[ 'oil and gas', 'Natural Language Processing' ] | [KTC.KTC_01, KTC.KTC_43]
[ 'apps' ] | [KTC.KTC_01, KTC.KTC_60]
[ 'xyo' ] | []
}
我的问题:
- 如果有人有一些线索可以帮助我修复这些漏洞...
- 有没有更优雅的方式来编写
getSymbolFromIndustries方法?
谢谢。
【问题讨论】:
标签: java groovy memory-leaks traits dry