如何使一个类中的私有哈希图对其他类可见[关闭]

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 的最佳方式。通常最好对正在检索的可变项制作防御性副本,以确保在程序执行期间检索到的值对于所有用户都是一致的。

【讨论】:

以上是关于如何使一个类中的私有哈希图对其他类可见[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

保护int,只对指定方法可见

面向对象之成员修饰符

在java中,如果没有给变量指定是公有或是私有,默认是啥?

公共方法对同一包中的其他类不可见

派生类中的抽象方法覆盖,如何使私有

如何访问派生类中的私有集属性[重复]