繁体   English   中英

单例设计模式无法分配值最终变量实例

[英]Singleton Design Pattern cannot assign value final variable instance

我正在尝试在ItemControl中使用Singleton设计模式 ,但是Android Studio说我无法将值分配给最终变量'instance' 如果变量必须为static final,如何编译我的代码?

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;
    }
}

你宣布

private static final ItemControl instance;

由于instancefinal ,因此无法在方法getInstance()instance分配值。 必须在声明时,在构造函数中或在初始化块中对其进行分配。

话虽如此,请考虑将您的单例实现为enum 请参阅什么是在Java中实现单例模式的有效方法? 如果您不能一起摆脱这一切。

声明实例时需要初始化它:

private static final ItemControl instance = new ItemControl();

这与Android Studio无关。 看,您拥有已声明为final的变量instance 并在getInstance()分配它。 因此,从最终版本开始,您无法将其分配到任何地方,而只能在其自身那里。

这样做:
private static final ItemControl instance = new ItemControl();

然后在getInstance()返回该变量

public static ItemControl getInstance() {
        return instance;
    }

我修好了它。 但是我是以java1.5之前的方式完成的。 我不明白如何使用“枚举”来做同样的事情。 如何使用枚举执行相同的单例模式? 我读了这个话题 ,但我听不懂。

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM