Как использовать @Singleton of Guice? - PullRequest
4 голосов
/ 13 декабря 2011

Мне нужно сделать один экземпляр некоторого класса - и этот один экземпляр должен быть доступен из любого места в коде.

Итак, я нашел Guice ... и я хочу использовать '@Singleton' из этого пакета, но я не нашел ни одного примера или документа о том, как его использовать и как сделать объявление.

Ответы [ 3 ]

7 голосов
/ 13 декабря 2011

@ Singleton очень прост в использовании. Просто так выглядит

@Singleton
public class A {

    @Inject
    public A() {
    }
}

Обратите внимание, что синглтон один на инжектор, а не на ВМ. 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

4 голосов
/ 13 декабря 2011

Хорошо, Мой ответ не является специфическим для @Singleton of Guice , но если вы хотите создать класс, доступный во всех ваших действиях, тогда я думаю, вы должны использовать приложение класс Android. (Это мое личное мнение для твоей необходимости)

Способ сделать это - создать собственный подкласс android.app.Application, а затем указать этот класс в теге приложения в манифесте . Теперь Android автоматически создаст экземпляр этого класса и сделает его доступным для всего вашего приложения. Вы можете получить к нему доступ из любого контекста, используя метод Context.getApplicationContext() (Activity также предоставляет метод 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. Обратите внимание, что это не будет работать между процессами (если ваше приложение является одним из редких, в котором есть несколько процессов).

Вот хороший урок о том, как его использовать, Расширение класса приложения Android и работа с Singleton

1 голос
/ 13 декабря 2011
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;
    } 
}

// попробуйте этот класс синглтона один раз.нет необходимости в методах получения и установки

DestinationViewManger dstv;

dstv=DestinationViewManger.getInstance();

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

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