Java Singleton在Glassfish服务器中实例化了两次

Java Singleton在Glassfish服务器中实例化了两次,java,jakarta-ee,intellij-idea,glassfish,singleton,Java,Jakarta Ee,Intellij Idea,Glassfish,Singleton,我的单例称为资源。我使用的这个单例标准应该只实例化一次: package site.kevindhu.models; 导入site.kevindhu.entity.Player; 导入java.util.HashMap; 导入java.util.HashSet; 导入java.util.Map; 公共类资源{ 公共静态资源; 公共地图数据; 静止的{ 资源=新资源(); } 私人资源(){ data=newhashmap(); data.put(“players”,新HashSet()); p

我的单例称为资源。我使用的这个单例标准应该只实例化一次:

package site.kevindhu.models;
导入site.kevindhu.entity.Player;
导入java.util.HashMap;
导入java.util.HashSet;
导入java.util.Map;
公共类资源{
公共静态资源;
公共地图数据;
静止的{
资源=新资源();
}
私人资源(){
data=newhashmap();
data.put(“players”,新HashSet());
put(“newPlayers”,newhashset());
}
公共静态资源getInstance(){
归还资源;
}

}
最好的方法是让编译器为您处理它:

/** Singleton. */
public enum Resources {
  RESOURCES;

  private final Map<String, Team> teams = new HashMap<>();

  public boolean add(Team team) {
    return team != null
        && teams.put(team.getName(), team) == null;
  }

  public Team find(String name) {
    return name == null ? null : teams.get(name);
  }

  public Team find(Team team) {
    return team == null ? null : get(team.getName());
  }

  public Map<String, Team> getTeams() {
    return Collections.unmodifiableMap(teams);
  }

  // remove, iterators, etc.
}

public class TeamImpl implements Team {
  private final String name;
  private final Map<String, Player> roster = new HashMap<>();

  public TeamImpl(String name) {
    if (name == null) {
      throw new IllegalArgumentException("name must not be null");
    }
    this.name = name;
    assert this.name != null;
  }

  @Override
  public boolean equals(Object other) {
    // base comparison on team name 
  }

  @Override
  public int hashCode() {
    assert this.name != null;
    return name.hashCode();
  }

  // methods from interface Team:

  @Override
  public String getName() {
    return name;
  }

  @Override
  public Set<Player> getRoster() {
    return Collections.unmodifiableSet(new HashSet<>(roster.values()));
  }

  @Override
  public boolean add(Player player) {
    return player != null
        && roster.put(player.getName(), player) == null;
  }

  @Override
  public Player find(String name) {
    return name == null ? null : roster.get(name);
  }

  // remove, iterators, etc.
}
/**Singleton*/
公共枚举资源{
资源;
私有最终映射团队=新HashMap();
公共布尔添加(团队){
返回团队!=null
&&teams.put(team.getName(),team)=null;
}
公共团队查找(字符串名称){
返回名称==null?null:teams.get(name);
}
公共团队查找(团队){
return team==null?null:get(team.getName());
}
公共映射getTeams(){
返回集合。不可修改地图(团队);
}
//删除、迭代器等。
}
公共类TeamImpl实现团队{
私有最终字符串名;
私有最终地图花名册=新HashMap();
public TeamImpl(字符串名称){
if(name==null){
抛出新的IllegalArgumentException(“名称不能为空”);
}
this.name=名称;
断言this.name!=null;
}
@凌驾
公共布尔等于(对象其他){
//基于团队名称的比较
}
@凌驾
公共int hashCode(){
断言this.name!=null;
返回name.hashCode();
}
//接口团队的方法:
@凌驾
公共字符串getName(){
返回名称;
}
@凌驾
公共集合get花名册(){
返回Collections.unmodifiableSet(新的HashSet(花名册.values());
}
@凌驾
公共布尔添加(播放器){
返回玩家!=null
&&花名册.put(player.getName(),player)=null;
}
@凌驾
公共播放器查找(字符串名称){
返回名称==null?null:花名册.get(名称);
}
//删除、迭代器等。
}

您的类很可能是由不同的类装入器装入的。根据你写的内容,像这样的定制单例可能不是应用服务器中最好的主意。我还建议这是一个类加载器问题。你的耳朵里有多个WAR文件吗?每个类都可能有自己的类加载器,因此有一个单独的资源实例。有关更多信息,请参阅。实际上,我已将部署更改为.war文件,但它仍然存在。再说一次,这并不意味着除了不同的类加载器正在加载您的类之外,还有什么其他意义。这种情况如何发生还取决于您引用它的方式和位置。EE API中有大量的工具来处理特定于应用程序或模块的资源和资源映射,尝试重新设计它们毫无意义。更新,我已经缩小了范围,当我调用使用resources.resources的方法时,它将在同一个方法调用中调用它两次。一次,调试器将所有变量显示为蓝色,另一次,它将显示为红色。我的意思是: