2016-11-15 2 views
0

Я пытаюсь использовать шаблон Singleton дизайн в ItemControl, но Android-студия говорит, что я не может присвоить значение переменной окончательное «например». Как я могу скомпилировать мой код, если переменная должна быть статической окончательной?Singleton Design Pattern не может присвоить значение переменной экземпляра окончательной

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

Зачем нужны эти переменные статические и конечные –

+0

Дизайн модели Singleton требует этого. Или нет? –

+0

не вы не нуждаетесь в этом –

ответ

0

Это не имеет ничего общего с Android Studio. У вас есть переменная instance, которая была объявлена ​​окончательной. И его назначают в getInstance(). Поэтому с момента своего финала вы не можете назначить его нигде, кроме самого себя.

Так что это:
private static final ItemControl instance = new ItemControl();

И в getInstance() возвращение, что переменная

public static ItemControl getInstance() { 
     return instance; 
    } 
+0

Ok. Я сделал это. Он работает сейчас. Как я могу это сделать с помощью перечисления? Я читал эту тему ниже, но я этого не понимал. http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java –

0

Вы объявили

private static final ItemControl instance; 

Поскольку instance является final вы не можете присвоить значение instance в методе getInstance(). Он должен быть назначен, когда он объявлен, в конструкторе или в блоке инициализации.

Это, как говорится, рассмотрите возможность применения вашего синглета в качестве enum. См. What is an efficient way to implement a singleton pattern in Java?, если вы не можете избавиться от всего этого.

+0

Я сделал это. Он работает сейчас. Но я не использовал перечисление, потому что не понял, как это сделать, используя enum ... –

0

Вам необходимо инициализировать экземпляр при объявлении его:

private static final ItemControl instance = new ItemControl(); 
+0

, но я хочу иметь контроль над этим экземпляром ... Я хочу иметь только один экземпляр объекта ItemControl ... и он должен быть доступен для всех частей моего приложения. –

+0

Затем вы можете сделать переменную экземпляра 'public static final', и вы можете получить доступ к экземпляру, вызвав' ItemControl.instance'. Поскольку он является статичным, он определяется на уровне класса, а не на уровне объекта, поэтому будет только один экземпляр. – jos76

+0

У вас также может быть getter для экземпляра, например, Uday описывает – jos76

0

Я зафиксировал его. Но я сделал это заранее. Я не понимал, как сделать то же самое, используя «enum». Как я могу сделать один и тот же шаблон с использованием перечисления? Я читал this topic, но я не понял.

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; 
    } 
} 
Смежные вопросы