在创建时或之后将对象添加到列表
Add objects to list on or after creation
在 java 中,我希望创建每个对象,并将其添加到对象样本列表中。
有没有办法在构造函数本身中做到这一点,例如:
public ObjectSample() {
mObjectSamples.add(this);
}
还是创建后必须调用add方法
您无法更改 Object
class 的构造函数。
您可以在其中一个 class 中使用构造函数,将新创建的实例添加到静态集合中。
public YourClass
{
public static List<YourClass> list = new ArrayList<>();
public YourClass()
{
list.add(this);
}
}
先创建您的对象,然后将此对象添加到 List
、
class MyClass{
private static List<Object> mObjectSamples = new ArrayList<Object>();
private int a,b;
MyClass(int a, int b){ // initialize your object using parametrized constructor
this.a = a; // suppose you have to initialize you a and b member of class.
this.b= b;
mObjectSamples.add(this);
}
}
将您对象的新实例添加到列表中。
public class Foo{
public static List<Foo> list = new List<Foo>();
public Foo(){
//Do whatever
}
public stativ void main(String args[]){
list.add(new Foo());
}
}
这将通过将新实例作为参数传递给 add()
方法来将对象添加到列表中。
首先,您不能修改库 class 的构造函数,尤其是 Object
的构造函数。但是,无论如何,我绝对不建议将 every new Object 放入列表中,因为有大量您甚至不需要关心的对象,而且我无法想象在任何情况下,您都希望将它们全部放入列表中。
如果您想要特定类型的每个对象,例如Element
在您的列表中,您可以像这样简单地定义 Element
class:
public class Element
{
public Element()
{
elements.add(this);
...
}
...
}
考虑静态工厂方法,正如 Joshua Block 的 Effective Java 所推荐的,this Baeldung post 中也有描述。如果您将构造函数设为私有,那么您的 class 只能由静态工厂方法实例化。将构造函数限制为执行对象的 class 指定字段的实例化,并让更通用的代码处理 class 之外的任何内容通常是个好主意。静态工厂方法是放置此类外部实例化的一个好地方。
对于概念元素 class,它可能如下所示:
public class Element {
private final List<Element> trackedElements = new ArrayList<>();
public static Element newTrackedElement(...) {
var e = new Element(...);
trackedElements.add(e);
...other out-of-class instantiation...
return e;
}
private Element(...) {
...in-class instantiation...
}
...
}
使用这种方法,集合只包含完全实例化的对象,并且保证在工厂方法调用完成时这些对象在集合中。它比拥有一个完全实现的工厂 class 更简单,如果创建新对象涉及足够多的额外工作,这可能会有用。
在 java 中,我希望创建每个对象,并将其添加到对象样本列表中。 有没有办法在构造函数本身中做到这一点,例如:
public ObjectSample() {
mObjectSamples.add(this);
}
还是创建后必须调用add方法
您无法更改 Object
class 的构造函数。
您可以在其中一个 class 中使用构造函数,将新创建的实例添加到静态集合中。
public YourClass
{
public static List<YourClass> list = new ArrayList<>();
public YourClass()
{
list.add(this);
}
}
先创建您的对象,然后将此对象添加到 List
、
class MyClass{
private static List<Object> mObjectSamples = new ArrayList<Object>();
private int a,b;
MyClass(int a, int b){ // initialize your object using parametrized constructor
this.a = a; // suppose you have to initialize you a and b member of class.
this.b= b;
mObjectSamples.add(this);
}
}
将您对象的新实例添加到列表中。
public class Foo{
public static List<Foo> list = new List<Foo>();
public Foo(){
//Do whatever
}
public stativ void main(String args[]){
list.add(new Foo());
}
}
这将通过将新实例作为参数传递给 add()
方法来将对象添加到列表中。
首先,您不能修改库 class 的构造函数,尤其是 Object
的构造函数。但是,无论如何,我绝对不建议将 every new Object 放入列表中,因为有大量您甚至不需要关心的对象,而且我无法想象在任何情况下,您都希望将它们全部放入列表中。
如果您想要特定类型的每个对象,例如Element
在您的列表中,您可以像这样简单地定义 Element
class:
public class Element
{
public Element()
{
elements.add(this);
...
}
...
}
考虑静态工厂方法,正如 Joshua Block 的 Effective Java 所推荐的,this Baeldung post 中也有描述。如果您将构造函数设为私有,那么您的 class 只能由静态工厂方法实例化。将构造函数限制为执行对象的 class 指定字段的实例化,并让更通用的代码处理 class 之外的任何内容通常是个好主意。静态工厂方法是放置此类外部实例化的一个好地方。
对于概念元素 class,它可能如下所示:
public class Element {
private final List<Element> trackedElements = new ArrayList<>();
public static Element newTrackedElement(...) {
var e = new Element(...);
trackedElements.add(e);
...other out-of-class instantiation...
return e;
}
private Element(...) {
...in-class instantiation...
}
...
}
使用这种方法,集合只包含完全实例化的对象,并且保证在工厂方法调用完成时这些对象在集合中。它比拥有一个完全实现的工厂 class 更简单,如果创建新对象涉及足够多的额外工作,这可能会有用。