引用整个应用程序中在一个类中创建的静态对象

时间:2011-11-22 17:27:07

标签: java object reference

我有一个java应用程序在基类中创建两个静态对象,这些对象需要在程序的各个类中引用。

public class Baseclass{
    public static ClassA A = new ClassA();
    public static ClassB B = new Classb();
    ...
    ...
    ...
}   

这些对象在其他类中被引用为本地私有变量。

public class ClassA{
    private ClassB b = Baseclass.B;

但是,两个对象都需要彼此运行,如果在创建另一个对象之前创建其中一个对象的新实例,则“upper”类中的局部变量将设置为null。 Java中是否有任何概念将对象的实际对象(如指针)作为变量引用而不是复制对象?

5 个答案:

答案 0 :(得分:8)

  

但是,两个对象都需要彼此运行,如果在创建另一个对象之前创建其中一个对象的新实例,则“upper”类中的局部变量将设置为null。

我认为您正在寻找的答案是“单身模式”。这是您只创建一个类的一个实例以便在其他地方使用的地方。这是一个good link to read。这是带有一些java示例的wikipedia page on it

所以你的代码看起来像这样:

public class A {
    private final static A instance = new A();

    /* private constructor forces you to use the getInstance() method below */
    private A() {}

    public static A getInstance() {
      return instance;
    }
}

然后,无论您想要获得A的实例,您都可以执行以下操作:

public class B {
    private final A classA = ClassA.getInstance();
    ...
}

没有理由A也不能拥有B的实例,并且在自己的方法中调用B的方法。你不能用这个交叉依赖关系来调用构造函数中的任何其他方法。

一般来说,顺便说一句,这些模式应该谨慎使用。实现此目的的更好方法是通过依赖注入而不是全局引用。交叉注射是可能的,但同样应该谨慎使用。更好的解决方案是重构类以具有线性依赖性。

  

Java中是否有任何概念可以将对象的实际对象(如指针)作为变量引用而不是复制对象?

Java是按值传递的,但任何Object的值都是对象的引用(类似于C中的指针,尽管它们是内存地址)。因此,如果您有A的实例并将其分配给另一个字段,则该字段将是相同的值,并将引用A的相同实例。

// instantiate a new instance of A
A a1 = new A();
// assign the reference to A to another variable
a2 = a1;
// they are equivalent and both reference the same object
if (a1 == a2) ...

答案 1 :(得分:1)

  

Java中是否有任何概念可以将对象的实际对象(如指针)作为变量引用而不是复制对象?

实际上,Java只有 引用。变量不能包含一个对象,所以不用担心。

此外,而不是做

private ClassB b = Baseclass.B;

我建议您考虑进行静态导入:

import static some.package.Baseclass.*;

答案 2 :(得分:1)

在Java中进行引用时,实际上是在制作引用的副本。您没有在示例中复制Baseclass.B。您正在将参考复制到Baseclass.B

在您提供的示例代码中,b将在为Baseclass.B定义之前为空。如果您需要对b执行操作,则无法在ClassA的声明中执行此操作。您需要在创建对象a之后调用的方法中执行此操作。

答案 3 :(得分:0)

这是单身人士的经典应用程序。

每一个:

  • 将构造函数设为私有。
  • 添加类自己类型的私有静态成员来保存 单。
  • 添加“getThe()”方法,如果尚未设置,则初始化上述成员。

请参阅wikipedia:Singleton pattern

通过在其上执行getThe()来构建A构造B的构造函数。

另外,请勿在{{1​​}}中使用公共字段;而是使用公共getter方法。不要保留单独的B变量;相反,请问A单身人士。

答案 4 :(得分:0)

  

Java中是否有任何可以引用实际对象的概念   (像指针一样)将对象作为变量而不是制作副本   对象?

执行此操作时:

private ClassB b = Baseclass.B;

你真正想到同一个对象,因为“b”变量被命名为Reference Variable。

关于你的问题,我的推荐是这样的:

首先封装参考:

public class ClassA{
    private ClassB b;

    public void setB(ClassB b) {
        this.b = b;
    }

    public ClassB getB(ClassB b) {
        return this.b;
    }

}

其次使用静态块来初始化变量:

public class Baseclass{
    public static ClassA A = new ClassA();
    public static ClassB B = new Classb();
    static {
        A.setB(B);
        B.setA(A);
    }
}