2015-03-22 13 views
9

Tôi có một hashmap trong lớp học mang tên DataStorage tôi:Tiếp cận một HashMap từ một lớp khác nhau

HashMap<String, Integer> people = new HashMap<String, Integer>(); 

people.put("bob", 2); 
people.put("susan", 5); 

Làm thế nào tôi có thể truy cập dữ liệu trong HashMap này trong một lớp học khác nhau?

+2

định nghĩa nó biến toàn cầu như tĩnh và sau đó bạn sẽ có thể truy cập nó từ lớp khác nhau. 'public static HashMap people = new HashMap ();' –

Trả lời

6

Tạo HashMap của bạn như là một biến dụ và cung cấp một phương pháp để truy cập vào API lớp học của bạn:

public class DataStorage { 
    private HashMap<String, Integer> people = new HashMap<String, Integer>(); 

    public HashMap<String, Integer> getPeopleMap() { 
     return people; 
    } 
} 

public class AnotherClass { 
     DataStorage x = new DataStorage();  

     private void someMethod() { 
      HashMap<String, Integer> people = x.getPeopleMap(); 
      //work with your map here... 
     } 
} 
1

Bạn có thể truy cập vào nó:

DataStorage storage = new DataStorage(); 
HashMap<String, Integer> people = storage.people; 
+0

Và công khai. :) – CandiedOrange

+0

Hoặc cùng một gói;) –

1

Bạn có thể làm cho công HashMap của bạn, hoặc tạo một getter cho nó:

public HashMap<String, Integer> getPeople() { 
    return people; 
} 

thì bạn có thể truy cập nó bằng cách sử dụng một thể hiện của DataStor lớp tuổi, như thế này:

DataStorage dataStorage = new DataStorage(); 
dataStorage.getPeople() 

hoặc, nếu bạn cũng làm cho cả hai phương thức getter và HashMap tĩnh:

DataStorage.getPeople() 

EDIT: Lưu ý, rằng nếu các biến dụ của bạn không được đặc biệt bổ truy cập , chúng mặc định truy cập package, có nghĩa là chúng có thể được truy cập từ các lớp khác được định nghĩa trong cùng một gói. Thông tin chi tiết về bổ truy cập có thể được tìm thấy trong documentation, đây là một bản tóm tắt ngắn gọn:

cấp độ truy cập

Modifier Class Package Subclass World 
public   Y   Y  Y  Y 
protected  Y   Y  Y  N 
no modifier  Y   Y  N  N 
private   Y   N  N  N 
1

Là một người ủng hộ của tell don't ask Tôi muốn hiển thị như thế nào điều này có thể được thực hiện mà không cần bất kỳ thu khí.

public class TellDontAsk { 

    interface MapSetter { 
     public void setMap(Map map); 
    } 

    interface MapGiver { 
     public void giveMap(MapSetter acceptMap); 
    } 

    public static void main(String[] args) { 
     HashMap<String, Integer> people = new HashMap<String, Integer>(); 

     people.put("bob", 2); 
     people.put("susan", 5); 

     DataStorage ds = new DataStorage(); 
     ds.setMap(people); 

     AnotherClass ac = new AnotherClass(); 
     ds.giveMap(ac); 

     ac.displayMap(); 
    } 

    public static class DataStorage implements MapSetter, MapGiver { 
     private Map map; 

     @Override 
     public void setMap(Map map) { 
      this.map = map;    
     } 

     @Override 
     public void giveMap(MapSetter acceptMap) { 
      acceptMap.setMap(map); 

     } 
    } 

    public static class AnotherClass implements MapSetter { 
     private Map map; 

     public void displayMap() { 
      System.out.println(map); 

     } 

     @Override 
     public void setMap(Map map) { 
      this.map = map;    
     } 
    } 
} 

Đầu ra:

{bob=2, susan=5} 

Chú ý cách DataStorage không có kiến ​​thức về sự tồn tại AnotherClass s? Cũng không AnotherClass biết về DataStorage. Tất cả những gì họ chia sẻ là một giao diện. Điều này có nghĩa là bạn tự do làm bất cứ điều gì bạn thích trong cả hai lớp miễn là bạn tiếp tục hỗ trợ giao diện đó.

BTW, các lớp này chỉ tĩnh vì tôi đã lười chuyển chúng vào tệp của riêng chúng. :)

+0

Quá nhiều dòng mã cho hiệu ứng quá ít ... Mã hóa siêu giao diện này dẫn đến mã không thể đọc được, chỉ ghi. – vojta

+1

@vojta có thể xử lý kho dữ liệu dưới dạng plugin không phải là một hiệu ứng nhỏ. – CandiedOrange

0

Đây là Eazy

public class ListDataStorage { 

      public static LinkedHashMap getHmapCashType(){ 

       LinkedHashMap<String, String> hMapCashType = new LinkedHashMap<String, String>(); 
       hMapCashType.put("A", "Cash"); 
       hMapCashType.put("B", "Credit"); 

       return hMapCashType; 
      } 
    } 

truy cập hashmap dữ liệu từ một lớp

String value = ListDataStorage.getHmapCashType().get("A").toString() 
Các vấn đề liên quan