如何使一个类中的私有哈希图对其他类可见[关闭]
Posted
技术标签:
【中文标题】如何使一个类中的私有哈希图对其他类可见[关闭]【英文标题】:How to make private hashmap in one class visible to other class [closed] 【发布时间】:2022-01-21 02:51:38 【问题描述】:所以在我的程序中一切都很好,但我读到在类中将变量设置为非私有是一个大错误,因为它可能会给大程序的其他部分带来问题。
好吧,我尝试将 HashMap 飞机和航班设为私有,但出现“Airplane.airplane 字段不可见”的错误消息,这当然是真的。
但是如何让它在接口类中可见呢?
在此先感谢,我还在学习中,我已经完成了这部分课程。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner imeskanera = new Scanner(System.in);
Airplane airplane = new Airplane();
flight flight = new flight();
interface_aerodrom ui = new interface_aerodrom(imeskanera,airplane,flight);
ui.start();
/ 飞机类
import java.util.HashMap;
public class Airplane
HashMap<String,Integer>airplane;
private String id;
private int capacity;
public Airplane()
this.airplane = new HashMap<String,Integer>();
public void add(String id, int capacity)
this.id = id;
this.capacity = capacity;
this.airplane.put(id, capacity);
public String id()
return this.id;
public int capacity()
return this.capacity;
public String airplaneinfo()
return this.id + "( " + this.capacity + " )";
/接口类
import java.util.Scanner;
public class interface_aerodrom
private Scanner imeskanera;
private Airplane airplane;
private flight flight;
public interface_aerodrom(Scanner scanner, Airplane airplane,flight flight)
this.imeskanera = scanner;
this.airplane = airplane;
this.flight = flight;
public void start()
System.out.println("Airport panel\r\n"
+ "--------------------");
System.out.println();
while(true)
System.out.println("Choose operation:\r\n"
+ "[1] Add airplane\r\n"
+ "[2] Add flight\r\n"
+ "[x] Exit");
String input = this.imeskanera.nextLine();
input = input.toLowerCase();
input = input.trim();
if(input.equals("x"))
flight_service();
break;
else if(input.equals("1"))
addairplane();
else if(input.equals("2"))
addflight();
public void flight_service()
System.out.println("Flight service\r\n"
+ "------------");
while(true)
System.out.println("Choose operation:\r\n"
+ "[1] Print planes\r\n"
+ "[2] Print flights\r\n"
+ "[3] Print plane info\r\n"
+ "[x] Quit");
String input = this.imeskanera.nextLine();
input = input.toLowerCase();
input = input.trim();
if(input.equals("quit"))
break;
else if(input.equals("1"))
for(String name : this.airplane.airplane.keySet())
int numberofseats = this.airplane.airplane.get(name);
String list = name + "( " + numberofseats + " )";
System.out.println(list);
else if(input.equals("2"))
for(String name : this.flight.flight.keySet())
String value = this.flight.flight.get(name);
String list = name + value;
System.out.println(list);
else if(input.equals("3"))
System.out.println("Give plane ID: ");
String planeid = this.imeskanera.nextLine();
if(airplanecontains(planeid))
int numberofseats = this.airplane.airplane.get(planeid);
System.out.println(planeid + "( " + numberofseats + " )" );
else
System.out.println("That plane is not in our database");
public void addairplane()
System.out.println("Give plane ID: ");
String ID = this.imeskanera.nextLine();
System.out.println("Give plane capacity: ");
int capacity = Integer.parseInt(this.imeskanera.nextLine());
this.airplane.add(ID, capacity);
public boolean airplanecontains(String ID)
if(this.airplane.airplane.containsKey(ID))
return true;
else
return false;
public void addflight()
System.out.println("Give plane ID: ");
String ID = this.imeskanera.nextLine();
if(airplanecontains(ID))
System.out.println("Give departure airport code: ");
String departure = this.imeskanera.nextLine();
System.out.println("Give destination airport code: ");
String destination = this.imeskanera.nextLine();
int seats = this.airplane.airplane.get(ID);
this.flight.flight.put(ID + " ( " + seats + " ) ",departure + "-" + destination);
else
System.out.println("This plane is not in our database");
/飞行等级
import java.util.HashMap;
public class flight
HashMap<String,String>flight;
public flight()
this.flight = new HashMap<String,String>();
public void add(String departure, String destination)
this.flight.put(departure, destination);
【问题讨论】:
您确实需要从一开始就遵循命名约定。查看您的目标,protected
看起来很合适,但为此,需要在您的子类中扩展 Airplane 以使地图可访问。
为 hashmap 提供 getter 有什么问题?
【参考方案1】:
将字段设为私有并不一定意味着您不能共享它。您可以使用 getter 返回 HashMap
。
private Map<String,Integer>airplane = new HashMap<>();
public Map<String,Integer> getAirPlaneMap()
return airplane;
原因是这隐藏了实现细节并允许将来进行更改而不影响类的用户。用户不需要知道地图在您的班级中来自哪里。您可以从您自己和用户不知道的地方检索到它。
您可能还想确保用户无法更改它。因此,您可以执行以下操作:
public Map<String,Integer> getAirPlaneMap()
return Collections.unModifiableMap(airplane);
以上内容将阻止用户添加或删除地图元素。但它不会阻止他们更改从地图中检索到的对象,除非该对象也是不可变的。
一般来说,setter 和 getter 是允许用户set and retrieve values
的最佳方式。通常最好对正在检索的可变项制作防御性副本,以确保在程序执行期间检索到的值对于所有用户都是一致的。
【讨论】:
以上是关于如何使一个类中的私有哈希图对其他类可见[关闭]的主要内容,如果未能解决你的问题,请参考以下文章