假设以下情况:
void thisIsCalledManyTimes(){
// ....
someObject.executeIfNecessary( new Runnable(){
void run(){ //do sth here}
});
}
匿名对象占用多少空间?我理解每个对象匿名obj都会在方法查找表中指向run
的相同实现。
答案 0 :(得分:5)
Runnable的源代码未指定任何字段,因此匿名类不会占用Object
以外的任何空间,但有两个不同之处。内部类具有对外部类实例的隐式引用,因此您可能希望将其考虑在内。它还将获取从外部类引用的final
变量的副本。
答案 1 :(得分:4)
匿名类占用的空间与非匿名类相同。所有对象都保持对它们是实例的类的引用。
匿名类唯一不同的是它将包含对
的引用答案 2 :(得分:1)
run
的所有实例确实将共享与方法查找表相同的“指针”。但是,对象的精确大小取决于run
和...
上方的内容。除了用于存储对封闭类的run
对象的引用的空间之外,编译器生成的匿名类还提供用于存储this
方法引用的变量的空间。
例如,
private String name;
void thisIsCalledManyTimes(){
final int value1 = 123;
final double value2 = 456.789.
someObject.executeIfNecessary( new Runnable(){
void run(){
System.out.println(name); // Referenced through the enclosing "this"
System.out.println(value1); // Variable will be inserted by the compiler
System.out.println(value2); // Variable will be inserted by the compiler
}
});
}
保留对象中的空间以存储value1
,value2
和this
;匿名对象的每个实例都将获得这些变量的副本。
答案 3 :(得分:0)
使用分析器检查类实例的大小。它很小,因为没有属性 - 它和java.lang.Object的实例一样大。这取决于JVM版本。
如果你需要做得更有效,那就去做:
void thisIsCalledManyTimes(){
// ....
if (someObject.isItNecessary()) {
someObject.execute( new Runnable(){
void run(){ //do sth here}
});
}
}
但是我不会为此烦恼太多。