Вернуть объект из Hashmap, если существует, если не создать - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь создать Фабрику со следующей функцией:

  • она всегда должна возвращать объект Filter.

  • Любой изhashmap =, если строковые буквы (ключ) уже существуют в hashmap, он должен просто взять свое значение (объект) из hashmap и вернуть его.

  • или новый, если в хэш-карте нет этого ключа, затем создайте новый объект и верните его.

Программа должна работать в следующем порядке в соответствии с пользовательским вводом:

 //user first input. 
 String letters="aaa"; // creat new object. 
 //user second input. 
 String letters="fff"; // creat new object. 

 String letters="aaa"; //dont make a new object and return the object and return the object of the first input.

Для этого я подумал о следующем:

  • Сначала я подумал о том, чтобы использовать хеш-карты.
  • , назначив String letters в качестве ключа и объект Filter в качестве значения.
  • затем я бы сохранил ключив строке массива и назначьте определенную позицию этого массива в качестве ключа на карте, а затем сравните, если ключ не был введен ранее, затем создайте новый объект, если ключ уже существует, и верните его объект.

Но я не могу создать массив строк, если не знаю его длины.

Вот что я написал на данный момент: (Я удалил массив.)

(FactoryClass)

 //if i let this i will getjava.lang.NullPointerException
 //private static Filter filter = null;
 public static Filter getFilter(String letters){

        Filter filter=new Filter(letters);

        HashMap <String, Object> hmap = new HashMap< String , Object> ();

        hmap.put(letters,filter);

        //for the first run is true because the map has yet only one pair of <k,v>
        if (hmap.containsKey(letters))
        {
            System.out.println("return the obj where there is a key match");//i will remove this later cz the user doesnt care about it. 
            //so i will return the filter object that has been created here "hmap.put(letters,filter);" by returning the value that matches the key.
            return (Filter) hmap.get(letters);  

        } else {//if the user didn't enter the same key then a new object shall be created!.

            System.out.println("new object has been generated");//i will remove this late cz the user doent care about it.
            //if the entered letters(key) isnt found in the map then put it in the map and creat new object. 
            hmap.put(letters, filter);

            return filter;
        }
    }

Конструктор в другом классе защищен, и фабрика будет получать строковые буквы для каждого пользовательского ввода из метода main.Любая помощь будет принята, но, пожалуйста, продемонстрируйте свои предложения в коде Java.

1 Ответ

0 голосов
/ 16 июня 2019

Как сказал Марк, вы ищете какое-то поведение, которое уже доступно на карте:

Где-то в вашем классе вы можете инициализировать Карту в качестве кеша:

private static final Map<String, Filter> filterCache = new HashMap<>();

В вашем методе getFilter:

return filterCache.computeIfAbsent(letters, l -> new Filter(l));

Это либо извлечет фильтр из карты для ключей, если он существует, либо вызовет второй параметр как функцию для вычисления значения, если его еще нет.

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

...