VS方法实例化类的实例化水平之间的差异(difference between class level

2019-07-21 00:12发布

什么是以下变量的用法区别

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”类内部,然后哪一个是更好的做法,为什么。 在什么情况下一个可以对子级使用。

Answer 1:

这些实际上有非常不同的含义。 在情况1中, b当对象被分配A被构造。 这是构建一次且仅一次(除非你是从什么地方类的外部重新分配它)。

在第二种情况下,你重新分配A's实例b每次调用该方法



Answer 2:

这里真正的区别是,做你想做的不同实例, B每次doSomething是叫什么名字? 在第二种情况下,这是真实的,但它也意味着你的类不是线程安全的,如果有使用任何其他方法B 。 如果有未使用的类中的任何其他方法B为什么不把它的方法范围的变量?



Answer 3:

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;
}


Answer 4:

Class level instantiation创建类的新对象时,将实例类的变量。 虽然method instantiation将实例化的变量,当方法被调用。

良好做法:你应该做的Class level instantiationinstantiate in Constructor时,你的类变量/必须是final或者使用method instantiation ,即lazy initialization



Answer 5:

第一种情况被称为内联初始化。 它将运行任何构造体之前,但在调用超构造函数之后发生。

在第二种情况b未初始化直到doSomething的称为()。

至于哪个更好,这就要看你的程序逻辑。 如果你想要一个新的实例每次DoSomething的被调用,第二种方式是更好的。 如果您更喜欢偷懒的负载b然后修改它是

if (b == null) b = new B(); 
return b;

我个人一般分配在构造函数可读性的原因实例变量。

public class A {
  B b;

  public A() {
    b = new B();
  } 
}


Answer 6:

我只是尝试了类似的情况,但由于一个错误我创建了一个场景递归代替(StackOverflow的错误): -

public class Test{

Test t=new Test();
public static void main(String[] args) {
       Test t=new Test();
       System.out.println("Hello");
}
} 

我想可能是有帮助的一些项目的概念的目的。



文章来源: difference between class level instantiation vs method instantiation