【问题标题】:How inheriting static fields affects the performance?继承静态字段如何影响性能?
【发布时间】:2012-01-02 05:42:11
【问题描述】:

由于静态字段对象是在类级别创建的(并且对所有对象都是通用的),是否对特定字段进行静态导入并继承(使用实现)所有字段将创建相同数量的内存?

例如,在下面的这个程序中,创建了多少个 MyOwn 对象?

class MyOwn{}

public interface ConstantIfc {
  public final static MyOwn REF = new MyOwn();
}

class A implements ConstantIfc {}
class B implements ConstantIfc {}

public class c {
   public static void main(String... arg) {
      A refA = new A();
      B refB = new B();
   }
 }

如果相同,静态导入的最终常量类如何优于常量接口?

更新:
我明白最好避免对常量进行继承。不恰当地利用实现继承通常会导致设计不灵活。所以我们可以更好地静态导入类/接口。但是接口仍然是一种抽象,为了保持抽象,它们不应该包含实现细节(包括常量变量)。接口也经常用于描述公共 API,其中不属于实现细节。出于这个原因,将常量数据放入一个类而不是一个接口是有意义的。谢谢robjb。

【问题讨论】:

  • 我相信只创建了一个实例(对于每个类加载器)。

标签: java


【解决方案1】:

在您给出的示例中,只有一个 MyOwn 对象被创建。它是在您的程序第一次加载ConstantIfc 接口时创建的。

即使您使用静态导入,答案仍然是相同的。静态导入在性能方面不应该比接口中的常量更好。将它们引入语言是为了避免接口,它们所做的只是将常量定义为从不用作接口(没有用它们输入变量),从而引起混淆。

【讨论】:

  • 非常感谢!但我仍然无法理解为什么只允许使用常量的 Ineterfaces。它有什么问题?请解释一下。或提供一些链接。
  • 不是不允许。他们只是气馁。更多细节可以在这里找到:en.wikipedia.org/wiki/Constant_interface
【解决方案2】:

为 MyOwn 实现一个默认构造函数,让它执行 println(),然后自己计算。

【讨论】:

  • 它只创建了一次。因此对于特定字段的静态导入或通过实现常量接口继承所有常量;两者都会创建相同的内存?
  • @Kanagavelu Sugumar:试试这个:
  • @Hannes R "try this" 无法访问。
  • 如果我正确理解您的问题,是的,它将使用相同的内存。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2012-06-21
  • 2016-10-22
  • 2013-04-18
相关资源
最近更新 更多