单例设计模式不能为变量实例赋值



我试图在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;

因为instancefinal,你不能在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;
    }
}

最新更新