Я пытаюсь создать Фабрику со следующей функцией:
она всегда должна возвращать объект 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.
хорошо, это, видимо, не решает проблему, но как решить проблему?
, поэтому я искал в Интернете и нашел computeIfAbsent, но я не знаю точно, как его использовать.на Java Orcale Doc это то, что написано иhmap.computeIfAbsent(letters, k -> new Filter (k) );
теперь я не понимаю, что означает здесь «k», и что означает «->», я пытался использовать его, как указано выше, но у меня возникли некоторые ошибки:
У меня уже есть следующее в фильтре классов
public class Filter {
private final String letters;
protected Filter(String letters) {
this.letters = letters;
}
public static void main(String[] args) {
while(true){
//Scanner to allow user to give input!.
Scanner in =new Scanner(System.in);
System.out.println("please enter the filter stirng!");
String filter= in.next();
}
}
public static Filter getFilter(String letters) {
Filter obj = hmap.get(letters);
if (obj == null) {
obj = new Filter(letters);
hmap.put(letters, obj);
}
return obj;
}