【问题标题】:different ways to create a new instance of a class?创建类的新实例的不同方法?
【发布时间】:2017-03-13 22:28:48
【问题描述】:

我知道有很多不同的方法可以创建 classinstance,我不太了解,但我刚刚看到了这种定义。
我什至不确定它是否正在制作一个新的instance!! 有点误会,我不能很好地消化它。

谁能解释一下下面的代码?

new timer().scheduleAtFixedRate(new TimerTask() {
          @Override
        public void run() {
            ...
        }
    }, 0, 1000);

上面的和下面的有区别吗?只要一样,你更喜欢哪一个?

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
          @Override
        public void run() {
            ...
        }
    }, 0, 1000);

【问题讨论】:

  • 我不希望第一个编译,除非timer()是一个构造函数,在这种情况下两者是相同的。
  • 如果我要多次使用一个变量,我用Timer t = new Timer()创建变量,否则new Timer()就足够了
  • 唯一的区别(除了编译错误)是,在第一个示例中,您没有timer 变量来引用代码后面的Timer 对象;例如如果您稍后出于某种原因需要致电timer.cancel()。假设你不这样做,第一种形式(IMO)更好。
  • 它们是不同的,但实际上两者都是错误的。我不会依赖Timer 在它被垃圾收集后继续运行,你肯定需要一些方法来停止它一段时间,所以你需要保留对它的引用,而不仅仅是在本地变量。

标签: java class oop instance


【解决方案1】:

这个有什么不同吗?只要有相同的, 你更喜欢哪一个?

首先,我想指出@Carcigenicate 在 cmets 中所说的话。

" 我不希望第一个编译,除非 timer() 是 构造函数,在这种情况下两者是相同的。”

我认为这是一个错误,您打算将 Timer() 写为构造函数调用。

下面的代码创建了一个Timer 类型的匿名对象,当您想在那里执行某项任务但又不希望再次使用Timer 对象时,可以使用该对象。基本上,您以后将无法在代码中再次重用该对象

new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                ...
            }
     }, 0, 1000);

下面的代码与上面的代码相同,除了这个不是匿名的object 并且我们可以稍后在我们的代码中重用object

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            ...
        }
    }, 0, 1000);

只要是一样的,你更喜欢哪一个?

这真的取决于情况和情况,但如果我要选择第二个,我会选择第二个,原因我上面已经说过了。

【讨论】:

  • 谢谢,只是为了澄清; 是的,Timer() 是一个构造函数。
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 2012-10-26
  • 2018-08-16
  • 2022-01-21
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多