【发布时间】:2015-06-14 13:48:39
【问题描述】:
案例: 我正在编写 SonarQube 规则,该规则需要检查手动创建的对象是否正在关闭。如果不是,则应提出问题。
让我们假设与确定对象是否手动创建(或不)相关的部分很容易且不相关。出于本示例的目的,它将是构造函数调用。但是,还有其他方法可以实例化此类对象,它们不符合关闭条件。
这些是我想介绍的案例。假设我们有以下类:
public class MyType {
public void close() {
//close
}
}
这是第一种情况。简单的一个:
public class ClassOne {
public void methodA() {
MyType z = null;
try {
z = new MyType();
// do sth
} finally {
z.close(); // correct use
}
}
public void methodB() {
MyType z = new MyType();
// do sth
// incorrect use, should be closed here
}
}
第二个,有点棘手:
public class ClassOne {
MyType creator() {
return new MyType();
}
MyType jump() {
return creator();
}
public void methodA() {
MyType z = null;
try {
z = jump();
// do sth
} finally {
z.close(); // correct use
}
}
public void methodB() {
MyType z = jump();
// do sth
// incorrect use, should be closed here
}
}
第三种情况,我无法处理:
public class ClassOne {
public void methodA() {
MyType z = null;
try {
z = new ClassTwo().creator();
// do sth
} finally {
z.close(); // correct use
}
}
public void methodB() {
MyType z = new ClassTwo().creator();;
// do sth
// incorrect use, should be closed here
}
}
public class ClassTwo {
MyType creator() {
return new MyType();
}
}
总结一下。我已经实施了第一种和第二种情况。我对第三个有问题,因为我不知道如何跳转到其他类的方法声明来分析它是否手动创建对象。
实现它的正确方法是什么?是否可以? (当然使用可用的 API)
分析的两个类都属于同一个项目,都包含在项目分析中。
【问题讨论】:
-
反对票不是我的(显然:))但我觉得这个问题有些不清楚。 手动创建到底是什么意思?构造函数调用?
SomeExternalClass是什么?正在分析的代码库之外的东西?finally块在哪里?你能举出这些物体被正确关闭的例子吗? -
@toniedzwiedz 嘿 :-),感谢您分享您对问题的疑虑。我详细阐述了这些。希望现在清楚了。