Как достать объект в синглтоне? - PullRequest
0 голосов
/ 22 октября 2018

Я создаю метод публичной функции (), определенный внутри класса Singleton (HouseCreator) для добавления нового объекта.Но я не знаю, как вызвать или получить объект внутри этого.

Заранее спасибо!

Вот мой исходный код:

Это мой основной класс>

public class TestSingleton {
    public static void main(String[] args) {
             HouseCreator hc = HouseCreator.getInstance();
              House h1 = hc.createHouse("A5B6","red");
              House h2 = hc.createHouse("GP44","blue");               
    }
}

и

class HouseCreator{
    private static HouseCreator instance = new HouseCreator();
    private HouseCreator(){
    }
    public static HouseCreator getInstance(){
        return instance;
    }
    public House createHouse(String address,String color){
       boolean alreadyCreate = true;
        if(alreadyCreate){
            return null;
        }else{
        return new House(address, color);
        }
    }
}

class House{
    private String address;
    private String  color;

    public House() {
    }

    public House(String address, String color) {
        this.address = address;
        this.color = color;
   }
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Если цель состоит в том, чтобы никогда не создавать одно и то же House дважды, поэтому никогда не создавать экземпляры 2 одинаковых по своему адресу и цвету домов, вы можете сохранить их в List

Если дом, который вы ищете, уже есть в списке, вы получите его (и новый экземпляр будет надет), если не сохраните тот, который вы создали, и добавите его в список

class HouseCreator{
    private static HouseCreator instance = new HouseCreator();
    private List<House> houses;

    private HouseCreator(){
        houses = new ArrayList<>();
    }

    public static HouseCreator getInstance(){
        return instance;
    }

    public House createHouse(String address,String color){
        House h = new House(address, color);
        int indexOf = houses.indexOf(h);
        if(indexOf < 0){
            houses.add(h);
            return h;
        }else{
            return houses.get(indexOf);
        }
    }
}

А в House классе добавить метод equals

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    House house = (House) o;
    return Objects.equals(address, house.address) && Objects.equals(color, house.color);
}
0 голосов
/ 22 октября 2018

Вам нужно хранить дома, которые вы где-то создаете.

Они создаются на основе адреса и цвета - это ключ, и вам нужно следить за ними:

import java.util.HashMap;
import java.util.Map;

class HouseCreator {
    private static HouseCreator instance = new HouseCreator();

    private final Map<HouseKey, House> createdHouses = new HashMap<>();

    private HouseCreator() {
    }

    public static HouseCreator getInstance() {
        return instance;
    }

    public House createHouse(String address, String color) {
        return createdHouses.computeIfAbsent(new HouseKey(address, color), x -> new House(address, color));
    }
}

class HouseKey {
    private String address;
    private String color;

    public HouseKey(String address, String color) {
        this.address = address;
        this.color = color;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((address == null) ? 0 : address.hashCode());
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        HouseKey other = (HouseKey) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        return true;
    }

}

class House {
    private String address;
    private String color;

    public House() {
    }

    public House(String address, String color) {
        this.address = address;
        this.color = color;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...