什么是以下变量的用法区别
public class A{
B b= new B();
public void doSomething()
{
b.callme();
}
}
VS
public class A {
B b;
public void doSomething() {
b=new B();
b.callme();
}
}
如果我们有一个“B”类内部,然后哪一个是更好的做法,为什么。 在什么情况下一个可以对子级使用。
这些实际上有非常不同的含义。 在情况1中, b
当对象被分配A
被构造。 这是构建一次且仅一次(除非你是从什么地方类的外部重新分配它)。
在第二种情况下,你重新分配A's
实例b
每次调用该方法
这里真正的区别是,做你想做的不同实例, B
每次doSomething
是叫什么名字? 在第二种情况下,这是真实的,但它也意味着你的类不是线程安全的,如果有使用任何其他方法B
。 如果有未使用的类中的任何其他方法B
为什么不把它的方法范围的变量?
Case 2:
是有帮助的延迟初始化
In case 1
的对象B
当创建的对象被创建A
。 但是,如果创建B
是繁重的操作 ,那么你可以懒洋洋地创建它,当你真正需要乙实例。
Lazy Initialization
是有帮助的,当创建对象是一个繁重的任务,你想懒洋洋地创建,只有当实际使用它的对象实例。 但不要照顾thread safety
,如果你的类被线程之间共享。
UPDATE:但在你的情况你重新分配b每次方法参考被调用。 这是不是延迟初始化本身。
//example of lazy initialization
public B getB()
{
if (something = = null)
b = new B();
return b;
}
Class level instantiation
创建类的新对象时,将实例类的变量。 虽然method instantiation
将实例化的变量,当方法被调用。
良好做法:你应该做的Class level instantiation
或instantiate in Constructor
时,你的类变量/必须是final
或者使用method instantiation
,即lazy initialization
第一种情况被称为内联初始化。 它将运行任何构造体之前,但在调用超构造函数之后发生。
在第二种情况b未初始化直到doSomething的称为()。
至于哪个更好,这就要看你的程序逻辑。 如果你想要一个新的实例每次DoSomething的被调用,第二种方式是更好的。 如果您更喜欢偷懒的负载b然后修改它是
if (b == null) b = new B();
return b;
我个人一般分配在构造函数可读性的原因实例变量。
public class A {
B b;
public A() {
b = new B();
}
}
我只是尝试了类似的情况,但由于一个错误我创建了一个场景递归代替(StackOverflow的错误): -
public class Test{
Test t=new Test();
public static void main(String[] args) {
Test t=new Test();
System.out.println("Hello");
}
}
我想可能是有帮助的一些项目的概念的目的。