首页 > 解决方案 > 调用 toString 方法时出现堆栈溢出错误

问题描述

这是我的代码,但是当我执行程序时出现很多错误,我不知道为什么。有人可以帮助我吗?

注册用户.java

public class RegisteredUser {
    private String nickname;
    ArrayList<ReviewDAO> reviews;

    public RegisteredUser(String nickname) {
        this.nickname = nickname;
        reviews = new ArrayList<>();
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void addReview(ReviewDAO review) {
        if (!this.reviews.contains(review)) {
            this.reviews.add(review);
            review.addRegisteredUser(this);
        }
    }

    @Override
    public String toString() {
        return "RegisteredUser{" +
                "nickname='" + nickname + '\'' +
                ", reviews=" + reviews +
                '}';
    }
}

回顾DAO.java

public abstract class ReviewDAO {
    RegisteredUser registeredUser;

    public abstract boolean write(Review review);

    public void addRegisteredUser(RegisteredUser registeredUser) {
        this.registeredUser = registeredUser;
    }

    @Override
    public String toString() {
        return "ReviewDAO{" +
                "registeredUser=" + registeredUser +
                '}';
    }
}

评论.java

public class Review {
    private String title;
    private String description;
    private int rank;
    private boolean isAnonymous;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public boolean isAnonymous() {
        return isAnonymous;
    }

    public void setAnonymous(boolean anonymous) {
        isAnonymous = anonymous;
    }
}

回顾DAO_MongoDB.java

public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}

回顾DAO_Factory.java

public class ReviewDAO_Factory {

    public ReviewDAO getReviewDAO(String technology) throws ExecutionControl.NotImplementedException {
        if (technology.equals("mongodb"))
            return new ReviewDAO_MongoDB();
        else
            throw new ExecutionControl.NotImplementedException("");
    }
}

业务逻辑.java

public class BusinessLogic {
    public static void main(String[] args) throws ExecutionControl.NotImplementedException {
        ReviewDAO_Factory reviewDAO_factory = new ReviewDAO_Factory();
        RegisteredUser registeredUser = new RegisteredUser("Alessandro");

        registeredUser.addReview(reviewDAO_factory.getReviewDAO("mongodb"));
        System.out.println(registeredUser.toString());
    }
}

我正进入(状态

在 ReviewDAO.toString(ReviewDAO.java: 15) ...

进程以退出代码 1 结束

错误

标签: javadesign-patterns

解决方案


首先,设计看起来有问题。永远不要将 POJO 与 DAO 混合使用。DAO 是处理 POJO 上的 CRUD 操作的“数据访问对象”类。在这里,您有 2 个 POJO - Review 和 RegisteredUser。ReviewDAO 负责对 Review 的托管/非托管实例(或实体)执行 CRUD 操作。对于RegisteredUser,您可能还需要另一个POJO(在您的实际代码中)。

其次,我看到您正在调用 List contains 方法来检查用户是否已经给出了该评论,但您尚未在 ReviewDAO 中实现“equals”和“hashCode”

public void addReview(ReviewDAO review) {
        if (!this.reviews.contains(review)) {
            this.reviews.add(review);
            review.addRegisteredUser(this);
        }
    }

我做了一些调整。请检查它是否满足您的需求:

RegisteredUser 类(已使用 hashset 导致“包含”搜索会更快)

public class RegisteredUser {
  private String nickname;
  private Set<Review> reviews;

  public RegisteredUser(String nickname) {
    this.nickname = nickname;
    reviews = new HashSet<>();
  }

  public String getNickname() {
    return nickname;
  }

  public void setNickname(String nickname) {
    this.nickname = nickname;
  }

  public void addReview(Review review) {
    if (!this.reviews.contains(review)) {
      this.reviews.add(review);
      //review.addRegisteredUser(this);
    }
  }

  @Override
  public String toString() {
    return "RegisteredUser{" +
        "nickname='" + nickname + '\'' +
        ", reviews=" + reviews +
        '}';
  }
}

回顾DAO类

public abstract class ReviewDAO {
  private RegisteredUser registeredUser;

  public abstract boolean write(Review review);

  public void addRegisteredUser(RegisteredUser registeredUser) {
    this.registeredUser = registeredUser;
  }

}

复习班

public class Review {
  private String title;
  private String description;
  private int rank;
  private boolean isAnonymous;

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public int getRank() {
    return rank;
  }

  public void setRank(int rank) {
    this.rank = rank;
  }

  public boolean isAnonymous() {
    return isAnonymous;
  }

  public void setAnonymous(boolean anonymous) {
    isAnonymous = anonymous;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o)
      return true;
    if (o == null || getClass() != o.getClass())
      return false;
    Review review = (Review) o;
    return Objects.equals(title, review.title);
  }

  @Override
  public int hashCode() {
    return Objects.hash(title);
  }
}

业务逻辑类

public class BusinessLogic {
  public static void main(String[] args) throws ExecutionControl.NotImplementedException {
    ReviewDAO_Factory reviewDAO_factory = new ReviewDAO_Factory();

    RegisteredUser registeredUser = new RegisteredUser("Alessandro");

    Review review = new Review();
    review.setTitle("some review");
    review.setDescription("some desc");

    registeredUser.addReview(review);

    ReviewDAO reviewDAO = reviewDAO_factory.getReviewDAO("mongodb");
    reviewDAO.addRegisteredUser(registeredUser);

    System.out.println(registeredUser.toString());
  }
}

推荐阅读