【问题标题】:How do you use anonymous objects with the factory pattern?如何在工厂模式中使用匿名对象?
【发布时间】:2015-08-07 18:01:54
【问题描述】:

我有这样的方法:

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 对象覆盖匿名对象。

我也尝试过创建一个包含 Foo 的 ArrayList 并在做

arrayList.add(new Foo());
arrayList.get(0) = FooFactory.createNewFoo();

它仍然显示“预期变量”。为什么这么说?

Foo foo = new Foo();
Foo otherFoo = foo;

这工作得很好,所以我不明白为什么我不能让工厂使用匿名对象。

我尝试在线搜索此内容,但没有搜索结果,这表明我可能犯了一些荒谬的错误/使用工厂模式错误。

【问题讨论】:

    标签: java factory-pattern anonymous-types


    【解决方案1】:

    Equals 是一个赋值 operator

    targetOfMyAssignment = thingImAssigning;
    

    new Foo() 是创建对象的语句。 它是制作人。你不能给它分配任何东西,它不是一个变量引用。变量引用,如Foo foo =,是消费者arraylist.get(0) 也是生产者。该语句,就像一个构造函数,提供一个值,但它不是你分配东西的参考。 arraylist.add(object) 也是一个消费者


    我想你也误解了anonymous type 是什么;匿名类型是您通过在类声明之后使用{} 指定新行为来覆盖其部分或全部行为in-line 的类型。例如:

    Runnable r = new Runnable() {
      public void run() {
        // code
      }
    };
    

    您需要匿名类型,因为Runnable 是一个接口,没有为run() 定义任何行为,因此Runnable r = new Runnable(); 不会编译。

    【讨论】:

      【解决方案2】:

      你在这里弄错了Java。 为了创建和保存一个对象,您需要一个参考(在您的左侧)和一个将产生您的对象的命令(在您的右侧)。您可以通过 new 关键字或方法调用(可以是工厂方法)来执行此操作。

      Foo f1 = new Foo();
      Foo f2 = FooFactory.createNewFoo();
      

      其次

      arrayList.get(0) = FooFactory.createNewFoo();
      

      错了,因为你检索的是一个对象,而不是一个引用,然后你想将一个对象分配给一个对象,而不是一个引用。

      arrayList.add(0, FooFactory.createNewFoo()); 
      

      这将在位置 0 中添加对象,并使用工厂方法创建的 Foo 对象。

      【讨论】:

        【解决方案3】:

        工厂模式通常涉及static 创建方法。这意味着在较高级别上,create 方法不是特定于单个工厂对象实例,而是在类本身的上下文中调用。相反,工厂会抽出您希望它创建的类型的实例对象。

        嗯,通常工厂会抽出实现您关心的接口的对象。在这种情况下,您不应该关心工厂抽出的具体对象类型。通过这种方式,工厂促进了基于接口的编程。但我离题了。

        底线,如果你在一个类上调用一个静态方法,你不需要先实例化那个类类型的对象。

        其他答案更好地解释了需要作为参考的等号运算符左侧的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          • 2017-06-16
          • 1970-01-01
          相关资源
          最近更新 更多