Не удается найти символ в строке toString

#java #cannot-find-symbol

Вопрос:

Проблема

Я пытаюсь создать простой Suitcase класс, который обертывает некоторые Item s, которые имеют a weight .

Я создал getTotalWeight() метод, и теперь я хочу вызвать его в своем toString методе, но я получаю:

не удается найти символ

по моему утверждению this.items.getTotalWeight() в toString методе. Почему? Что я делаю не так?

Код

Вот код:

Item.java

 public class Item {  private int weight;  private String name;    public Item(String name, int weight) {  this.name = name;  this.weight = weight;  }    public String toString() {  return this.name   " ("   this.weight   ")";  }    public int getWeight() {  return this.weight;  }  }  

Suitcase.java

 import java.util.ArrayList;  public class Suitcase {  private ArrayListlt;Itemgt; items;   public Suitcase() {  this.items = new ArrayListlt;gt;();  }   public void addItem(Item item) {  this.items.add(item);  }   public int getTotalWeight() {  int totalWeight = 0;  for (Item item : items) {  totalWeight  = item.getWeight();  }  return totalWeight;  }   public String toString() {  if (this.items.size() == 1) {  return this.items.size()   " item ("   this.items.getTotalWeight()   " kg)";  } else {  return this.items.size()   " items ("   this.items.getTotalWeight()   " kg)";  }  } }  

Ответ №1:

Объяснение

Это справедливо this.getTotalWeight() или справедливо getTotalWeight() . Метод принадлежит вашему Suitcase классу (вашему this в контексте), а не тому items , который относится к типу ArrayList .

Так что исправьте это, чтобы:

 public String toString() {  if (this.items.size() == 1) {  return this.items.size()   " item ("   this.getTotalWeight()   " kg)";  } else {  return this.items.size()   " items ("   this.getTotalWeight()   " kg)";  } }  

Кроме того, пожалуйста, никогда не забывайте добавлять @Override , когда вы переопределяете методы (например, toString ), это дает вам дополнительную помощь компилятора.


Упрощения

При этом вы можете немного упростить код, например так:

 @Override public String toString() {  String itemText = items.size() == 1 ? "item" : "items";  return "%d %s (%d kg)".formatted(items.size(), itemText, getTotalWeight()); }  

Ключевыми изменениями являются:

  • избавляясь от дублирования кода, ветвление должно содержать только ту часть, которая действительно изменяется (т. Е. item vs items )
  • использование троичного для удобства чтения вместо if-else
  • использование форматированных строк для удобства чтения
  • удаление устаревших this. префиксов
  • добавление Override