gpt4 book ai didi

java - 避免在循环中实例化对象 - SONAR 合规性

转载 作者:行者123 更新时间:2023-11-30 02:36:19 26 4
gpt4 key购买 nike

在循环内实例化对象是每个开发人员常用的方法。

我们在循环内实例化具有不同泛型和集合类型的不同对象,这是不建议的。定义一个私有(private)方法来获取实例可以解决这个问题。但我正在寻找实现相同目标的通用方法。

示例:在下面的代码中

if (CollectionUtils.isNotEmpty(xList)) {
for (final X x : xList) {
final List<Y> yList = new ArrayList<Y>();
final Z z = new Z();
populateYList(yList);
if (CollectionUtils.isNotEmpty(yList)) {
// do something
}
}

当我们采用通用方式时,它是对象安全的吗?下面是我的一些努力

private <T> List<T> getCollectionIntializer(Class<T> type) {
return new ArrayList<T>();
}


private <T> T getIntializer(Class<T> clazz) {
T c = null;
try {
c = (T) clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return c;
}

最后我的代码看起来像

if (CollectionUtils.isNotEmpty(xList)) {
for (final X x : xList) {
final List<Y> yList = getCollectionIntializer(Y.class);
final Z z = getIntializer(Z.class);
populateYList(yList);
if (CollectionUtils.isNotEmpty(yList)) {
// do something
}
}

将这些方法隔离在单独的静态类中以便可以在所有类中使用是否是一种安全的方法。从类的范围之外实例化对象?

提前分享想法和感谢

最佳答案

这完全取决于您如何处理通过这些方法获得的集合或对象。如果有人可能用您不期望的类型调用它,这可能会导致错误,我认为最好以某种方式限制对这些方法或类的访问。

如果您希望在这些方法中只出现具有特定父类(super class)的子类,则可以使用通配符。例如:

private <T extends Number> List<T> getCollectionIntializer(Class<T> type) {
return new ArrayList<T>();
}

如果我以这种方式调用 getCollectionIntializer 方法:

SomeClass someClass = new SomeClass();
List<SomeClass> list = someClass.getCollectionIntializer(someClass.getClass());

我会得到一个编译错误:

Error:(27, 41) java: method getCollectionIntializer in class SomeClass cannot be applied to given types;
required: java.lang.Class<T>
found: java.lang.Class<capture#1 of ? extends SomeClass>
reason: inferred type does not conform to upper bound(s)
inferred: capture#1 of ? extends SomeClass
upper bound(s): java.lang.Number

也许会有帮助。

关于java - 避免在循环中实例化对象 - SONAR 合规性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42978617/

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