我有一个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中是否有任何概念将对象的实际对象(如指针)作为变量引用而不是复制对象?
答案 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)
这是单身人士的经典应用程序。
每一个:
请参阅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);
}
}