Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在singleton中获取对象?_Java_Singleton - Fatal编程技术网

Java 如何在singleton中获取对象?

Java 如何在singleton中获取对象?,java,singleton,Java,Singleton,我创建了一个公共函数method(),它是在类Singleton(HouseCreator)中为addnewobject定义的。但我不知道如何调用或获取其中的对象 提前谢谢 以下是我的源代码: 这是我的主课> public class TestSingleton { public static void main(String[] args) { HouseCreator hc = HouseCreator.getInstance();

我创建了一个公共函数method(),它是在类Singleton(HouseCreator)中为addnewobject定义的。但我不知道如何调用或获取其中的对象

提前谢谢

以下是我的源代码:

这是我的主课>

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");               
    }
}


你需要把你建造的房子存放在某个地方

它们是根据地址和颜色创建的-这是关键,也是您需要跟踪它们的方式:

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;
    }
}
import java.util.HashMap;
导入java.util.Map;
阶级家庭创造者{
private static HouseCreator实例=new HouseCreator();
private final Map createdHouses=new HashMap();
私人房屋创造者(){
}
公共静态HouseCreator getInstance(){
返回实例;
}
public House createHouse(字符串地址、字符串颜色){
返回CreatedHouse.computeIfAbsent(新房屋钥匙(地址,颜色),x->new House(地址,颜色));
}
}
班房钥匙{
私有字符串地址;
私有字符串颜色;
公钥(字符串地址、字符串颜色){
this.address=地址;
这个颜色=颜色;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((address==null)?0:address.hashCode();
result=prime*result+((color==null)?0:color.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
房屋钥匙其他=(房屋钥匙)obj;
如果(地址==null){
if(other.address!=null)
返回false;
}如果(!address.equals(other.address))
返回false;
如果(颜色==null){
if(other.color!=null)
返回false;
}else如果(!color.equals(other.color))
返回false;
返回true;
}
}
班房{
私有字符串地址;
私有字符串颜色;
酒店(){
}
酒店(字符串地址、字符串颜色){
this.address=地址;
这个颜色=颜色;
}
公共字符串getAddress(){
回信地址;
}
公共无效设置地址(字符串地址){
this.address=地址;
}
公共字符串getColor(){
返回颜色;
}
公共void setColor(字符串颜色){
这个颜色=颜色;
}
}

如果目的是避免两次创建相同的
房屋,那么不要实例化两个与地址和颜色相同的房屋,您可以将它们存储在
列表中

如果你要找的房子已经在列表中,你会得到它(新的实例化的房子会被扔掉),如果不保留你实例化的房子并将其添加到列表中

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);
        }
    }
}

boolean-alreadyCreate=true;如果(alreadyCreate){return null;
…这始终是真的,并且将始终返回
null
。您对HouseCreator使用Singleton,并且此Singleton应该只构建一个House实例?^^^^ Java 5+中推荐的方法是使用带有单个值
实例的枚举。不要创建HouseKey,因为它与House保持完全相同,所以拥有2倍于要求的数据…或者让House持有房屋钥匙。您需要一些东西来封装{address,color}元组
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);
        }
    }
}
@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);
}