Не удается получить переменные класса в списке

Мне необходимо отсортировать список объектов класса, и вывести айди, название объектов

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 шт):

Автор решения: Alex Rudenko

Указанная ошибка компиляции говорит об отсутствующих геттерах для полей класса 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

→ Ссылка