Suponha que você tenha criado uma classe Livro, com o título, descrição, nome do autor e etc. Após isso tenha criado uma classe LivroControl que possuirá um ArrayList de Livros e que conterá os métodos necessários para o controle dessa lista de livros. Acontece que você deseja que essa lista seja única e acessível para toda a aplicação. O que você faz?
Os dois caminhos mais comuns são:
1) Instanciar um objeto LivroControl no método onCreate da classe Application
2) Usar o padrão Singleton
Caso 1: Instanciando LivroControl no Application
Application existe em todo aplicativo Android. É criado na abertura do aplicativo e, também possui um ciclo de vida, que é diferente de uma Activity. Mas, como vou alterar o meu Application?
Para alterá-lo é preciso criar uma classe filha e depois, basta sobrescrever o método onCreate, como no exemplo abaixo:
public class CustomApplication extends Application{
private LivroControl livroControl;
@Override
public void onCreate() {
super.onCreate();
livroControl = new LivroControl();
}
public LivroControl getLivroControl() {
return livroControl;
}
}
Para usar esse CustomApplication no lugar do Application é necessário alterar um atributo xml chamado 'name' que está dentro da tag <application> do AndroidManifest.xml. Segue um exemplo:
<application
android:name=".application.CustomApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Feito isso, é possível acessar a CustomApplication de qualquer lugar:
final CustomApplication customApplication = getCustomApplication();
List<Livro> listaLivros = customApplication.getLivroControl().retrieveLista();
Caso 2: Usando o padrão Singleton
No padrão Singleton, o construtor de LivroControl deverá ser privado. Portanto, não poderá ser instanciado por alguém fora da classe. Quem fará a única instanciação será um método chamado getInstance, que instanciará o LivroControl apenas uma única vez. O método getInstance deve ser estático e thread-safe. Segue o código de exemplo:
public final class LivroControl {
private final List<Livro> listaLivro = new ArrayList<>();
private static ItemControl INSTANCE;
private ItemControl() { }
public static synchronized ItemControl getInstance() {
if (INSTANCE == null) {
INSTANCE = new ItemControl();
}
return INSTANCE;
}
}
Também é possível fazer esse mesmo Singleton usando Enumerações. Basta jogar todos os métodos de LivroControl para dentro de uma Enum e os métodos do LivroControl apenas acessarão os métodos do Enum. Veja o exemplo baixo:
public final class LivroControl {
public void adicionarLivro(Livro livro) {
ListaLivros.INSTANCE.adicionarLivro(livro);
}
public enum ListaLivros {
INSTANCE;
private static List<Livro> listaLivro;
static {
listaLivro = new ArrayList<>();
}
private ListaLivros() { }
public void adicionarLivro(Livro livro) {
listaLivro.add(livro);
}
}
}
Recomendo a leitura desta discussão caso queira se aprofundar no uso de Enumerações em Singletons:
What is an efficient way to implement a singleton pattern in Java?
Marcadores
actionbar
(3)
adapter
(1)
android
(17)
android studio
(4)
atalhos
(1)
collections framework
(1)
ContextMenu
(1)
custom application
(1)
DAO
(1)
eclipse
(1)
erro
(1)
fatorial
(1)
fibonacci
(1)
fragments
(1)
git
(3)
GitHub
(2)
ícones
(2)
intent-filter
(1)
java
(4)
jsf
(1)
listview
(1)
máscara
(1)
MaskFormatter
(1)
material design
(2)
menu suspenso
(1)
permissões
(1)
plugin
(1)
RadioButton
(1)
recursividade
(1)
singleton
(1)
SQLite
(1)
SQLiteOpenHelper
(1)
startActivityForResult
(1)
toolbar
(1)
xml
(3)
quinta-feira, 17 de novembro de 2016
Uso de Singleton e Application customizado
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário