Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有必要创建一个内部类,将其用作外部类的实例变量?_Java_Inner Classes - Fatal编程技术网

Java 有必要创建一个内部类,将其用作外部类的实例变量?

Java 有必要创建一个内部类,将其用作外部类的实例变量?,java,inner-classes,Java,Inner Classes,我的问题是,仅仅因为我需要从这个类访问一个外部实例变量,所以创建一个内部类是否正确。但真正的问题是“将这个内部类也用作同一外部类的实例变量是否正确?” 在我的特定情况下,我有一个名为Exam的外部类,并且应该有一个关联的结果,但是结果(它将是字符串或双精度)取决于ExamType(这是一个考试实例变量) 因此,我不确定最佳做法是: 要创建一个独立的结果类作为构造函数接收,请输入ExamType 创建一个内部Result类,该类可以轻松访问Exam实例变量(特别是ExamType变量),并将其实

我的问题是,仅仅因为我需要从这个类访问一个外部实例变量,所以创建一个内部类是否正确。但真正的问题是“将这个内部类也用作同一外部类的实例变量是否正确?”

在我的特定情况下,我有一个名为
Exam
的外部类,并且应该有一个关联的结果,但是结果(它将是
字符串
双精度
)取决于
ExamType
(这是一个考试实例变量)

因此,我不确定最佳做法是:

  • 要创建一个独立的
    结果
    类作为构造函数接收,请输入
    ExamType
  • 创建一个内部
    Result
    类,该类可以轻松访问
    Exam
    实例变量(特别是
    ExamType
    变量),并将其实例化为
    Exam
    类的实例变量

我会选择选项1:在
结果的构造函数中传递
ExamType

原因主要是可测试性:由于
Result
仅依赖于显式传递给它的对象,因此很容易单独测试它的功能

另一个可能的原因是序列化:如果您只想序列化
结果
对象,将其作为
检查
的内部类将强制
检查
与其一起序列化。通常这不是你想要的


Result
是顶级类还是
静态嵌套类取决于您,这一决定取决于可读性。如果您的
结果
类相对简单,并且
考试
也不是很复杂,请使用静态嵌套类,否则,请使用单独的顶级类。

您应该仔细阅读,选项1可能更干净,并且更易于单独测试。在构造函数中使用ExamType的单独结果类可能是一个好方法。它很干净。谢谢你干净的回答!我只想澄清一点,如果我决定将
Result
设置为
private static nested
类,并且我创建了一个
Result
对象,这个对象无法访问
Exam
类实例变量,所以我必须离开构造函数,因为这个类将作为顶级类,是吗?是的。静态嵌套类的行为与顶级类几乎完全相同。(唯一的区别在于对
private
字段或方法的访问。)