我试图在ItemControl中使用单例设计模式,但Android Studio说我不能将值分配给最终变量'instance'。我怎么能编译我的代码,如果变量必须是静态的最终?
public final class ItemControl {
private final Map<Long, Item> itemMap = new HashMap<>();
private static final ItemControl instance;
private ItemControl() { }
public static synchronized ItemControl getInstance() {
if(instance == null) {
instance = new ItemControl();
}
return instance;
}
public void addItem(Item item) {
itemMap.put(item.getId(), item);
}
public List<Item> retrieveItems() {
if(itemMap.isEmpty()) {
List<Item> items = carregarItems();
if(items != null) {
for(Item item : items) {
itemMap.put(item.getId(), item);
}
}
}
return new ArrayList<>(itemMap.values());
}
private List<Item> carregarItems() {
List<Item> items = new ArrayList<>();
Item.Builder livroBuilder = new Item.Builder(System.nanoTime(), "Java for Beginners")
.setAno(2013).setAutor("Glauber Rocha").setQuantidade(3)
.setDescricao("Livro para programadores iniciantes.");
Item.Builder revistaBuilder = new Item.Builder(System.nanoTime(), "Geek on the table")
.setAno(2013).setAutor("Robson Duarte").setQuantidade(2)
.setDescricao("Revista para geeks.");
items.add(livroBuilder.build());
items.add(revistaBuilder.build());
return items;
}
}
这与Android Studio无关。看,变量instance
被声明为final。它被分配到getInstance()
中。因为它是final,所以你不能将它赋值到任何地方,只能赋值到它本身。
那么这样做:private static final ItemControl instance = new ItemControl();
在getInstance()
中返回变量
public static ItemControl getInstance() {
return instance;
}
在声明实例时需要初始化实例:
private static final ItemControl instance = new ItemControl();
您声明
private static final ItemControl instance;
因为instance
是final
,你不能在getInstance()
方法中给instance
赋值。它必须在声明时、在构造函数中或在初始化块中赋值。
话虽如此,考虑将单例实现为enum
。参见在Java中实现单例模式的有效方法是什么?
我修复了。但我用的是java1.5之前的方式。我不明白如何使用'enum'做同样的事情。我如何使用枚举做相同的单例模式?我读了这个题目,但是我不懂。
public final class ItemControl {
private final Map<Long, Item> itemMap = new HashMap<>();
private static final ItemControl instance = new ItemControl();
private ItemControl() {
if(instance != null) {
throw new IllegalStateException("ItemControl já foi instanciado.");
}
}
public static synchronized ItemControl getInstance() {
return instance;
}
public void addItem(Item item) {
itemMap.put(item.getId(), item);
}
public List<Item> retrieveItems() {
if(itemMap.isEmpty()) {
List<Item> items = carregarItems();
if(items != null) {
for(Item item : items) {
itemMap.put(item.getId(), item);
}
}
}
return new ArrayList<>(itemMap.values());
}
private List<Item> carregarItems() {
List<Item> items = new ArrayList<>();
Item.Builder livroBuilder = new Item.Builder(System.nanoTime(), "Java for Beginners")
.setAno(2013).setAutor("Glauber Rocha").setQuantidade(3)
.setDescricao("Livro para programadores iniciantes.");
Item.Builder revistaBuilder = new Item.Builder(System.nanoTime(), "Geek on the table")
.setAno(2013).setAutor("Robson Duarte").setQuantidade(2)
.setDescricao("Revista para geeks.");
items.add(livroBuilder.build());
items.add(revistaBuilder.build());
return items;
}
}