2009-12-08 42 views
3

我有一些像这样的代码:我的工厂有什么问题?

public abstract class Foo { 
    public static Foo getFoo() { 
     return new FooImpl(); 
    } 

    abstract void DoFoo(); 

    private class FooImpl extends Foo { 
     public FooImpl() { } 

     @Override 
     void DoFoo() { } 
    } 
} 

但是Eclipse是告诉我No enclosing instance of type Foo is accessible.所以,我怎么能得到这个工作?

我试图使它尽可能简单,看它是否会编译:

public abstract class Foo { 
    public static Foo getFoo() { 
     return new FooImpl(); 
    } 

    private static class FooImpl extends Foo { 
     public FooImpl() { } 
    } 
} 

我仍然得到同样的错误。我错过了什么?

固定!我改了行return new FooImpl();return new Foo.FooImpl();

+1

public Foo getFoo()应该是public static Foo getFoo()。 猜测一个错误只出现在错误中,并且getFoo是静态的。 – 2009-12-08 02:32:41

+0

是的,你是对的。 – jasonh 2009-12-08 02:38:50

回答

9

优秀解释here - 简单地说,你需要做的类FooImplstatic,所以它只能依赖于外部类,而不是外部类的特定实例(你没有)。 getFoo方法也看起来应该是静态的,顺便说一句 - 否则,实例Foo你计划打电话吗?

+0

我将在连接工厂中使用它。基本上,包的使用者不应该知道实现他们要求的连接的具体类。因此会有'connect()'''disconnect()'等方法,这些方法在Connection类中是抽象的,每个实现都负责提供具体的实现。 – jasonh 2009-12-08 02:34:44

2

你打算如何打电话给getFoo()

除非你正在做一些完全时髦和激进的事情,否则你需要制作它static

1

使FooImplstatic它会工作。