当我们通常想要创建由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原则设计对象的设计/可访问性。
答案 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有关的方面,静态成员类都是顶级类。
从性能的角度来看,可以期望静态成员类的性能与作为实际顶级类编写的同一类相同。静态成员类的实例独立于其封闭类,并且不需要封闭类实例即可实例化。