Estrutura de menu [Ajuda]

Olá, sou iniciante na linguagem e tenho como desafio criar uma estrutura de menus onde cada um deles devem ter uma descrição, exemplo: Produtos, Clientes… Os menus devem ser exibidos apenas se o usuário tem permissão para isso. O desafio é criar o programa para que seja possível inserir a estrutura do menu e o programa montar o mesmo de acordo com a estrutura informada (pelo scanner mesmo) e tem que informar quais itens o usuário tem acesso.

Exemplo:

Produtos
    Bicicleta
    Telefone

Clientes
   Pessoas
   número   

Até então eu consegui realizar o menu corretamente porem, eu preciso identificar que saiu do menu “Pessoas” e vai entrar no menu “Produtos” e imprimir os submenus de produtos, eu só consigo imprimir os mesmos submenus.

> package programaJava;
> 
> import java.util.ArrayList;
> 
> public class Programa {
> 	
> 	public static void main(String[] args) {
> 		
> 		ArrayList<Menus> menu = new ArrayList<Menus>();
> 		ArrayList<SubMenus> subMenu = new ArrayList<SubMenus>();
> 		
> 		menu.add(new Menus("Pessoas"));
> 		menu.add(new Menus("Produtos"));
> 		
> 		subMenu.add(new SubMenus("Joao"));
> 		subMenu.add(new SubMenus("Maria"));
> 		subMenu.add(new SubMenus("Carlos"));
> 		
> 		
> 		for(Menus i: menu) {
> 			System.out.println(i.nome);
> 			for(SubMenus j: subMenu) {
> 				System.out.println("  " + j.nome);
> 			}
> 		}
> 	}
> }		


> package programaJava;
> 
> public class Menus {
> 
> 	 String nome;
> 	
> 
> 	public Menus(String nome) {
> 		super();
> 		this.nome = nome;
> 	}
> 
> 	public String getNome() {
> 		return nome;
> 	}
> 
> 	public void setNome(String nome) {
> 		this.nome = nome;
> 	}  
> }

> package programaJava;
> 
> public class SubMenus {
> 
> 	String nome;
> 
> 	public SubMenus(String nome) {
> 		super();
> 		this.nome = nome;
> 	}
> 
> 	public String getNome() {
> 		return nome;
> 	}
> 
> 	public void setNome(String nome) {
> 		this.nome = nome;
> 	}
> }

Talvez seja melhor vc tentar a abordagem de hierarquia, assim:

Menu

public class Menu {

	private String descricao;
	private Menu pai;
	private List<Menu> subMenus;
	
	private Menu(String descricao) {
		this.descricao = descricao;
	}
	
	private Menu(Menu pai, String descricao) {
		this.pai = pai;
		this.descricao = descricao;
	}
	
	public static Menu of(String descricao) {
		return new Menu(descricao);
	}
	
	public static Menu of(Menu pai, String descricao) {
		return new Menu(pai, descricao);
	}
	
	public Menu addSubMenu(String subMenu) {
		if(subMenus == null) {
			subMenus = new ArrayList<>();
		}
		
		subMenus.add(Menu.of(this, subMenu));
		return this;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Menu getPai() {
		return pai;
	}

	public void setPai(Menu pai) {
		this.pai = pai;
	}

	public List<Menu> getSubMenus() {
		return subMenus;
	}

	public void setSubMenus(List<Menu> subMenus) {
		this.subMenus = subMenus;
	}
}

Não há necessidade de criar classes diferentes para representar menu e submenu. Afinal, ambos são menus, soh que em níveis diferentes.

@Lucas_Camara Beleza você consegue me explicar melhor? no caso eu também não estou conseguindo implementar a recursividade para que ele identifique um menu novo e abra os submenus posteriormente, eu só estou conseguindo abrir os mesmos submenus, não estou conseguindo entender muito bem a lógica =/