在Java中将静态内部类用作POJO是否是一个好主意

时间:2019-03-04 02:01:19

标签: java

当我们通常想要创建由List<MyObject> = new ArrayList<>();之类的POJO组成的集合时,我们通常会自行创建公共类MyObject

但是如果我们在声明该集合的父类中创建一个private static MyObject内部类怎么办?

这里是一个示例:

public class MyClass {
    public static void main(String args[]) {

        List<MyObj> objList = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            MyObj obj = new MyObj();
            obj.name = "Odel B Jr.";
            obj.age = "2";

            objList.add(obj);
        }

        System.out.println(objList);

    }

    private static class MyObj {
        private String name;
        private String age;

        @Override
        public String toString() {
            return "MyObj [name=" + name + ", age=" + age + "]";
        }
    }
}

请注意,这将创建10个new静态对象。

我的事情是,哪个更好? 10个新的静态对象或10个新的常规Java对象?

我正在尝试从JVM的角度来解决这个问题-即专注于性能。并不是完全按照Java OOP原则设计对象的设计/可访问性。

2 个答案:

答案 0 :(得分:1)

如果将在类之外访问对象MyObject,则它必须是公共的,例如它是域对象。

如果类外部的对象和方法不需要直接使用MyObject,则最好将类创建为私有类并隐藏其实现细节。这与面向对象编程(OOP)原理封装非常吻合,有人说这是OOP的四个基本原理之一。

如果您想知道不需要共享什么,请考虑这种情况。您有一个Car类,并且有一个内部Engine对象。另一个Driver类推着油门踏板,只想移动Car,并不关心Engine的实现方式,这为汽车设计师提供了设计发动机的灵活性。当他们遵守设计引擎的规则时,他们可以将他们想要的任何引擎放在汽车上。如果驾驶员对引擎的工作原理有所了解,例如其一些内部属性和功能,并且说某些Driver开始使用这些功能,那么在下一次汽车设计中,现在的设计人员没有相同的水平。为了提高灵活性,他们需要了解驱动程序正在使用的Engine的功能,如何使用它们并在使用时提供这些功能,否则Driver会需要更改行为。

对于域对象示例,假设我们有一个Student对象。 Enrollment对象和PaymentPlan对象需要访问该对象。即使您在另一个课程中使用了List<Student> students,您也想将Student设为该课程之外的公共课程,而不是在该课程中将其公开。

答案 1 :(得分:0)

  

我的事情是,哪个更好? 10个新的静态对象或10个新的常规对象   java对象?

     

我正在尝试从JVM的角度来解决这个问题-即   专注于性能。与对象的设计/可访问性无关   根据Java OOP原则。

静态成员类可以看作是普通的顶级类,恰好嵌套在一个封闭的类中。在几乎所有与JVM有关的方面,静态成员类都是顶级类。

从性能的角度来看,可以期望静态成员类的性能与作为实际顶级类编写的同一类相同。静态成员类的实例独立于其封闭类,并且不需要封闭类实例即可实例化。