2011-12-13 37 views
4

我需要创建某个类的一个实例 - 并且这个实例需要可以从代码中的任何地方访问。如何使用Guice的@Singleton?

所以,我找到了Guice ......并且我想从这个包中使用'@Singleton',但是我没有找到任何示例或一些文档来告诉我如何使用它以及如何进行声明。

+0

您应该检查roboguice.org – Macarse

+0

我检查......这仍然是无法理解 – Yanshof

+0

这是Android的关系吗? –

回答

4

好吧,我的回答是不特定的吉斯的@Singleton,但如果你想一类是通过访问你所有的活动,然后我认为,您必须使用应用类的Android。 (这是我个人的看法您的需求)

做到这一点的方法是创建自己的android.app.Application子类,然后指定类应用程序中的标签在你的清单。现在,Android会自动创建该类的一个实例,并使其可用于整个应用程序。可以从任何上下文使用Context.getApplicationContext()方法(活动还提供了一种方法getApplication()其具有完全相同的效果)访问它:

class MyApp extends Application { 

    private String myState; 

    public String getState(){ 
    return myState; 
    } 
    public void setState(String s){ 
    myState = s; 
    } 
} 

class Blah extends Activity { 

    @Override 
    public void onCreate(Bundle b){ 
    ... 
    MyApp appState = ((MyApp)getApplicationContext()); 
    String state = appState.getState(); 
    ... 
    } 
} 

这具有基本上如使用静态变量或单相同的效果,但相当集成进入现有的Android框架。请注意,这不适用于各个流程(如果您的应用程序是具有多个进程的罕见应用程序之一)。

下面是有关如何使用它漂亮的教程,Extending the Android Application class and dealing with Singleton

+0

谢谢!我真的是新的'安卓'..所以这是非常有帮助的! – Yanshof

+0

更简单的是使用Scala语言代替。你可以定义一个'object'并完成:它可以从任何Activity和其他类访问。这实际上就像实施单件工厂,但斯卡拉自动为你做这一切。 –

7

@Singleton非常易于使用。它只是这样

@Singleton 
public class A { 

    @Inject 
    public A() { 
    } 
} 

但是请注意,单是每一个VM的每个喷射不能及的。 Singleton是一个范围类型,GUICE还允许自定义范围,这可能非常有用。请参阅下面的链接。

当你在另一个类中使用它时,你只需要注入它。

public class B { 
    @Inject 
    public B(A a) { 
    } 
} 

http://code.google.com/p/google-guice/wiki/Scopes

http://code.google.com/p/google-guice/wiki/GettingStarted

+0

那么,在公共B(A a)中......它总是需要在puclic C(A a)中创建的同一个实例吗? – Yanshof

+2

只要您的注射器是相同的。它基本上是一个范围实例。所以在那个对象中,层次结构实例“a”在该注入器下将是相同的。 –

+1

请注意,Guice有很多方法可以做同样的事情。我们也可以在configure()中使用bind(Iface.class).to(Impl.class).in(Scopes.SINGLETON)进行绑定时在模块中指定singleton-ness,但是我发现Guice 3.0并不总能保证唯一性使用Module.configure()中的绑定注释。 @SidMalni的解决方案似乎解决了Module.configure()绑定方法的问题。 – jlb

1
public class DestinationViewManger { 

    private static final DestinationViewManger instance = new DestinationViewManger(); 
    public Boolean flag=false; 

// Private constructor prevents instantiation from other classes 
    private DestinationViewManger(){ } 

    public static DestinationViewManger getInstance() { 
     return instance; 
    } 
} 

//尝试这一次单例类。不需要getter和setter方法

DestinationViewManger dstv; 

dstv=DestinationViewManger.getInstance(); 

dstv.flag=true; //set the value for your flag 

boolean whatFlagboo=dstv.flag; //get your flag wherever you want