Как в методе класса вывести переменную другого класса
Дано задание вывести список товаров определенного каталога. Я написала класс Food и его подклассы Meat и Apple которые имеют интерфейсы Meat1 и Vegatables1. Как сделать чтобы этот метод возвращал name класса Meat или Apple? В главном классе был написан метод getKatalog(String slovo) который должен был выводить необходимые имена экземпляров класса которые бы использовали необходимый интерфейы, но он не работает :) Когда запускала код написало, что переменная meat не имеет названия, то тогда как этот метод сделать рабочим?
public class Food {
String name;
String katalog;
Meats meat;
Apples apple;
public String getKatalog(String slovo) {
if (slovo.equals(Vegatables1.name)) {
return apple.getApple();
}
if (slovo.equals(Meat1.name)) {
return meat.getMeats();
} else {
return "error";
}
}
}
public class Meats extends Food implements Meat1 {
String name;
public Meats(String name, String katalog) {
this.name = name;
this.katalog = katalog;
}
public String getMeats() {
return Meats.this.name;
}
}
public class Apples extends Food implements Vegatables1 {
String name;
public Apples(String name, String katalog) {
this.name = name;
this.katalog = katalog;
}
public String getApple() {
return this.name;
}
}
public interface Vegatables1 {
String name = "vegatables1";
}
public interface Meat1 {
String name = "meat1";
}
public class Main {
public static void main(String[]args) {
Food food = new Food();
Apples aplle = new Apples("red", "vegetables");
Meats meat = new Meats("cow1", "meat");
Meats meatCowl = new Meats("cow2");
System.out.println(food.getKatalog("meat1"));
}
}
Ошибка:
Exception in thread "main" java.lang.NullPointerException
at dz.Food.getKatalog(Food.java:44)
at main.Main.main(Main.java:32)
Заранее спасибо!
Ответы (1 шт):
У вас в Food поля Meats meat; Apples apple; не инициализированы, поэтому при обращении к ним возникает NPE.
Попробуйте инициализировать те поля:
public static void main(String[]args) {
Food food = new Food();
food.apple = new Apples("red", "vegetables");
food.meat = new Meats("cow1", "meat");
System.out.println(food.getKatalog("meat1"));
}
Но это должно исправить NPE, а вот с самим заданием -- нет.
Накидал примерное решение (перечисление):
import java.util.ArrayList;
import java.util.List;
enum FoodType {
VEGATABLE,
MEAT
}
interface IFood {
String getName();
FoodType getType();
}
class Food implements IFood {
private String name;
private FoodType type;
public Food(String name, FoodType type) {
this.name = name;
this.type = type;
}
@Override
public String getName() {
return name;
}
@Override
public FoodType getType() {
return type;
}
}
public class Foods {
private List<IFood> foods = new ArrayList<>();
public void add(String name, FoodType type) {
foods.add(new Food(name, type));
}
public void addMeat(String name) {
add(name, FoodType.MEAT);
}
public void addVegatable(String name) {
add(name, FoodType.VEGATABLE);
}
public List<IFood> getFoods(FoodType type) {
List<IFood> items = new ArrayList<>();
for (IFood food : foods) {
if (food.getType() == type) {
items.add(food);
}
}
return items;
}
public List<IFood> getFoods() {
return foods;
}
public static void main(String[] args) throws Exception {
Foods foods = new Foods();
foods.add("Свинина", FoodType.MEAT);
foods.addMeat("Курица");
foods.addMeat("Говядина");
foods.addVegatable("Огурец");
foods.addVegatable("Помидор");
foods.addVegatable("Картофель");
for (IFood food : foods.getFoods(FoodType.MEAT)) {
System.out.println(food.getName());
}
// Свинина
// Курица
// Говядина
System.out.println();
for (IFood food : foods.getFoods(FoodType.VEGATABLE)) {
System.out.println(food.getName());
}
// Огурец
// Помидор
// Картофель
}
}
Вариант без перечисления.
При желании тут можно сделать класс Food реализующего интерфейс IFood и наследовать Meat с Vegatable от Food (при этом, только у Food будет конструктор с полем name и getName, а Meat и Vegatable по сути будут пустыми)
Пример:
import java.util.ArrayList;
import java.util.List;
interface IFood {
String getName();
}
class Meat implements IFood {
private String name;
public Meat(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
class Vegatable implements IFood {
private String name;
public Vegatable(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
public class Foods {
private List<IFood> foods = new ArrayList<>();
public void add(IFood food) {
foods.add(food);
}
public void addMeat(String name) {
add(new Meat(name));
}
public void addVegatable(String name) {
add(new Vegatable(name));
}
public List<IFood> getMeats() {
List<IFood> items = new ArrayList<>();
for (IFood food : foods) {
if (food instanceof Meat) {
items.add(food);
}
}
return items;
}
public List<IFood> getVegatables() {
List<IFood> items = new ArrayList<>();
for (IFood food : foods) {
if (food instanceof Vegatable) {
items.add(food);
}
}
return items;
}
public List<IFood> getFoods() {
return foods;
}
public static void main(String[] args) throws Exception {
Foods foods = new Foods();
foods.add(new Meat("Свинина"));
foods.addMeat("Курица");
foods.addMeat("Говядина");
foods.addVegatable("Огурец");
foods.addVegatable("Помидор");
foods.addVegatable("Картофель");
for (IFood food : foods.getMeats()) {
System.out.println(food.getName());
}
// Свинина
// Курица
// Говядина
System.out.println();
for (IFood food : foods.getVegatables()) {
System.out.println(food.getName());
}
// Огурец
// Помидор
// Картофель
}
}