我有一个方法:
public class FooFactory {
public Foo createNewFoo(){
return new foo();
}
}
现在,如果我这样做:
FooFactory fooFactory = new FooFactory();
Foo foo = FooFactory.createNewFoo();
它会完美地运作。但是,如果我尝试这样做:
new Foo() = FooFactory.createNewFoo();
它似乎根本不起作用。它说"变量预期"。
我理解new Foo()
本身会创建一个新的Foo对象,但即使我使用工厂,它也应该用新的Foo
对象覆盖匿名对象。
我还尝试创建一个{F}的ArrayList
来做
arrayList.add(new Foo());
arrayList.get(0) = FooFactory.createNewFoo();
它仍然表示"变量预期"。为什么这么说?
Foo foo = new Foo();
Foo otherFoo = foo;
这很好用,所以我不明白为什么我不能用匿名对象让工厂工作。
我尝试在网上搜索,但我没有搜索结果,这告诉我,我可能犯了一些荒谬的错误/使用错误的工厂模式。
答案 0 :(得分:5)
targetOfMyAssignment = thingImAssigning;
new Foo()
是创建对象的语句。 这是一个制片人。你不能给它分配任何东西,它不是一个变量引用。变量引用(如Foo foo =
)是使用者。 arraylist.get(0)
也是制作者。该语句,就像构造函数一样,提供一个值,但它不是您分配内容的参考。 arraylist.add(object)
也是消费者。
我认为你也误解了anonymous type的含义;匿名类型是指通过在{}
类声明后指定新行为来覆盖部分或全部行为内嵌的类型。例如:
Runnable r = new Runnable() {
public void run() {
// code
}
};
您需要一个匿名类型,因为Runnable
是一个接口,没有为run()
定义行为,因此Runnable r = new Runnable();
将无法编译。
答案 1 :(得分:0)
你在这里得到了Java错误。 为了创建和保持一个对象,你需要一个Reference(在你的左边)和一个产生你的对象的命令(在你的右边)。您可以通过new关键字或方法调用(可以是工厂方法)来执行此操作。
Foo f1 = new Foo();
Foo f2 = FooFactory.createNewFoo();
其次
arrayList.get(0) = FooFactory.createNewFoo();
是错误的,因为您正在检索对象而不是引用,然后您想要将对象分配给对象,而不是引用。
arrayList.add(0, FooFactory.createNewFoo());
这将使用工厂方法创建的Foo对象在位置0添加对象。
答案 2 :(得分:0)
工厂模式通常涉及static
创建方法。这意味着在高级别上create方法不是特定于单个工厂对象实例,而是在类本身的上下文中调用。相反,工厂会抽出您想要创建的类型的实例对象。
嗯,通常工厂会抽出实现你关心的接口的对象。在这种情况下,您不应该关心工厂泵出的具体物体类型。通过这种方式,工厂便于基于接口的编程。但我离题了。
最重要的是,如果要在类上调用静态方法,则不需要首先实例化该类类型的对象。
其他答案可以更好地解释关于等于运算符左侧的东西需要作为参考。