组合:如何在没有空指针异常的情况下使用点符号访问非静态变量?
Composition: How to access non-static variables with dot notation without nullpointerexception?
我经常看到 'nested' classes 中的非静态变量(不完全是内部 class 的嵌套而是 class 组合)通过点符号。
例如
int a = getClassA().classB.classC.x; where
getClassA() return一个Class类型的对象,A和x是我们有兴趣访问的变量。
classB 是 ClassA 中的变量。
classC 是 ClassB 中的一个变量。
x 是 ClassC 中的一个变量。
但是,当我尝试重新创建类似的测试场景时,出现 NullPointerException 错误。
代码
public class Main()
{
public static void main(String[] args) {
int a = getClassA().classB.classC.x;
}
}
public class ClassA
{
ClassB classB;
}
public class ClassB
{
ClassC classC;
}
public class ClassC
{
int x = 1;
}
//Class Main, A, B and C are in separate files.
附加组件
在某处读到,在 c# 中有自动实现 属性。对于上面的示例,Class A 将是
public Class A {
private ClassB _classB;
public ClassB classB
{
get {
if (_classB == null) _classB = new ClassB();
return _classB; }
set {_classB = value; }
}
}
因此,ClassB 在通过点符号访问时被实例化。 Java中有类似的东西吗?
感谢对此的任何帮助。
谢谢。
如果这是确切的代码,由于缺少 getClassA()
方法而无法提供,则不要实例化 ClassB
或 C
,所以 NPE
是预期的。
通过实例化对象确保对象不为空
例如
public class ClassA
{
ClassB classB = new ClassB ();
}
public class ClassB
{
ClassC classC = new ClassC ();
}
我经常看到 'nested' classes 中的非静态变量(不完全是内部 class 的嵌套而是 class 组合)通过点符号。
例如
int a = getClassA().classB.classC.x; where
getClassA() return一个Class类型的对象,A和x是我们有兴趣访问的变量。
classB 是 ClassA 中的变量。
classC 是 ClassB 中的一个变量。
x 是 ClassC 中的一个变量。
但是,当我尝试重新创建类似的测试场景时,出现 NullPointerException 错误。
代码
public class Main()
{
public static void main(String[] args) {
int a = getClassA().classB.classC.x;
}
}
public class ClassA
{
ClassB classB;
}
public class ClassB
{
ClassC classC;
}
public class ClassC
{
int x = 1;
}
//Class Main, A, B and C are in separate files.
附加组件
在某处读到,在 c# 中有自动实现 属性。对于上面的示例,Class A 将是
public Class A {
private ClassB _classB;
public ClassB classB
{
get {
if (_classB == null) _classB = new ClassB();
return _classB; }
set {_classB = value; }
}
}
因此,ClassB 在通过点符号访问时被实例化。 Java中有类似的东西吗?
感谢对此的任何帮助。
谢谢。
如果这是确切的代码,由于缺少 getClassA()
方法而无法提供,则不要实例化 ClassB
或 C
,所以 NPE
是预期的。
通过实例化对象确保对象不为空
例如
public class ClassA
{
ClassB classB = new ClassB ();
}
public class ClassB
{
ClassC classC = new ClassC ();
}