как создать новую карту с конструктором?

Я желаю сделать две вещи

  1. Создайте частную переменную экземпляра, которая является картой

  2. Создать пустой экземпляр в моем конструкторе, который реализует карту и присваивает ее предыдущей частной переменной экземпляра.

Частный экземпляр, который я имею,

private final Map<Character, SortedSet<String>> thesaurus = 
                      new HashMap <Character, SortedSet<String>>();

но как создал бы переменную экземпляра в конструкторе, который сошлется на тезаурус частной переменной после создания конструкторов.

Например,

public class Book{

    private final Map<Character, SortedSet<String>> thesaurus = 
                           new HashMap <Character, SortedSet<String>>();

public Book(){

    super();    
    /* What do i put here as an empty instance 
     * variable that implements a map and how 
     * do i assign it to thesaurus? 
     */
}
7
задан Iharob Al Asimi 19 August 2015 в 10:51
поделиться

2 ответа

Не совсем понятно, о чем вы спрашиваете, но вот некоторые моменты:

  • Вы не можете объявить переменную экземпляра в конструкторе; вы должны объявить ее как член типа (т.е. как поле).
  • Вы можете присваивать значения уже объявленным переменным экземпляра в конструкторе.
  • Вы не обязаны присваивать значения переменным экземпляра в конструкторе; вы можете сделать это при объявлении.

Когда вы пишете что-то вроде этого:

public class Book{

   private final Map<Character, SortedSet<String>> thesaurus =
      new HashMap <Character, SortedSet<String>>(); 
   //...

}

Затем вы объявили thesaurus переменной экземпляра класса Book, а также инициализировали ее значение как new HashMap. Поскольку это поле является конечным, вы больше не можете установить его значением что-либо другое (за исключением атак на основе отражения).

Вы можете, если захотите, перенести инициализацию в конструктор. Это можно сделать, даже если поле является final (с учетом различных определенных правил присваивания).

public class Book{

   private final Map<Character, SortedSet<String>> thesaurus;

   public class Book {
      thesaurus = new HashMap <Character, SortedSet<String>>();
   }
   //...

}

Нечто подобное иногда делается, когда, например, создание начального значения может вызвать проверяемое исключение и поэтому должно быть помещено в блок try-catch.

Другой вариант - инициализировать поля в блоке инициализатора экземпляра:

   private final Map<Character, SortedSet<String>> thesaurus;

   {
      thesaurus = new HashMap <Character, SortedSet<String>>();
   }

И еще один вариант - рефакторить блок инициализатора экземпляра в вспомогательный метод:

   private final Map<Character, SortedSet<String>> thesaurus = emptyMap();

   private static Map<Character, Sorted<String>> emptyMap() {
      return new HashMap <Character, SortedSet<String>>();
   }

Ссылки

Похожие вопросы

7
ответ дан 7 December 2019 в 05:16
поделиться

Вы уже инициализируете переменную тезауруса картой. Вы можете переместить его в конструктор, например:

public class Book
{
  private final Map<Character, SortedSet<String>> thesaurus;

  public Book(){
    this.thesaurus = new HashMap <Character, SortedSet<String>>();    
  }
}

Однако менять не нужно. В любом случае поле экземпляра будет инициализироваться каждый раз при создании экземпляра. Также обратите внимание, что здесь вам не нужен super () , поскольку он неявный.

1
ответ дан 7 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: