Не удается получить переменные класса в списке
Мне необходимо отсортировать список объектов класса, и вывести айди, название объектов
package com.para;
import java.lang.Comparable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Program {
public static void main(String[] args) {
List fruitList=new ArrayList();
Fruit apple=new Fruit(1, "Apple", "Sweet");
Fruit orange=new Fruit(2, "Orange", "Sour");
Fruit banana=new Fruit(4, "Banana", "Sweet");
Fruit grape=new Fruit(3, "Grape", "Sweet and Sour");
fruitList.add(apple);
fruitList.add(orange);
fruitList.add(banana);
fruitList.add(grape);
Collections.sort(fruitList);
fruitList.forEach(fruit -> {
System.out.println(fruit.getId() + " " + fruit.getName() + " " +
fruit.getTaste());
});
}
}
class Fruit implements Comparable{
private int id;
private String name;
private String taste;
Fruit(int id, String name, String taste){
this.id=id;
this.name=name;
this.taste=taste;
}
@Override
public int compareTo(Object o) {
Fruit f = (Fruit) o;
return this.id - f.id ;
}
}
Делал по примеру Клик. Но у меня ошибка:
java: cannot find symbol
symbol: method getId()
java: cannot find symbol
symbol: method getName()
java: cannot find symbol
symbol: method getTaste()
Ответы (1 шт):
Указанная ошибка компиляции говорит об отсутствующих геттерах для полей класса Fruit:
java: cannot find symbol symbol: method getId()
java: cannot find symbol symbol: method getName()
java: cannot find symbol symbol: method getTaste()
Для доступа к свойствам/полям класса, объявленным как private используются методы геттеры (с префиксом get, для чтения), и сеттеры (с префиксом set, для чтения).
Их можно генерировать автоматически в любой приличной среде разработки типа Eclipse/IntelliJ IDEA и др., или же при помощи аннотаций @Getter/@Setter или @Data проекта Lombok, или, как бы это не было тяжело, написать их самостоятельно:
// class Fruit
public int getId() { return id; }
public String getName() { return name; }
public String getTaste() { return taste; }
Однако, данная ошибка могла бы вовсе не возникнуть, если бы в классе Fruit был переопределён метод toString, отвечающий за строковое представление объекта (для его генерации также существует аннотация Lombok ToString).
// class Fruit
@Override
public String toString() {
return "Fruit: id=" + id + "; name=" + name + "; taste=" + taste;
}
Тогда построчный вывод списка выглядел бы просто как:
fruitList.forEach(System.out::println);
Кроме того, при реализации интерфейса Comparable следовало бы указать, что сравниваются именно фрукты, а не фрукты с любыми объектами.
public class Fruit implements Comparable<Fruit> {
@Override
public int compareTo(Fruit f) {
if (null == f) return 1; // null поместить в конец
return Integer.compare(this.id, f.id);
}
}
Тогда можно убрать излишнее приведение типов Fruit f = (Fruit) o;, которое может привести к ClassCastException. Также при сравнении целых чисел лучше избегать вычитания, так как оно может привести к целочисленному переполнению, и использовать стандартный метод Integer::compare