案例:我在写SonarQube规则,需要检查手动创建的对象是否正在关闭。如果不是,则应提出问题。如何分析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)
这两个分析的类都属于同一个项目并且包含在项目分析中。
向下的票是不是我的(显然:)),但我觉得这个问题有些不清楚。你是什么意思_manual creation_?构造函数调用?什么是“SomeExternalClass”?分析之外的代码库之外的东西? 'finally'块在哪里?你能举出这些物体正确关闭的例子吗? – toniedzwiedz
@toniedzwiedz嘿:-),谢谢你分享你对问题的怀疑。我详细阐述了这些。希望现在清楚。 –