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