Java- 如何从同一个包中的 class 获取私有数据

Java- How to get private data from a class in the same package

我有两个class在同一个包下。
Class A 有一个 private hashmap _books = new ConcurrentHashMap<String,Book>(); 字符串标题是键。
在 class B 中,我想从 class A 中的私人地图中按标题检索某个 Book object。

我试图在 class A

中添加一个 public 方法
public Book getBookFromMap(String title ){
    return _books.get(title);
} 

在 class B 中,我尝试调用该方法,但没有成功。 Eclipse 说 "the method getBookFromMap is undefined"。在 class 中,我尝试这样做:

Book bookFromMap= getBookFromMap(booktitle);

那时候红线出现在classB的getBookFromMap下面。我想可能是我调用的不对吧?我该如何解决这个问题?非常感谢!

_books改为

ConcurrentHashMap<String,Book> _books;

(只需删除行首的 private)。

或者使用反射访问字段,见How do I read a private field in Java?

您可以使用 Java 反射 API,但在大多数情况下不推荐这样做。 Here's example

Book bookFromMap= aObjectOfClassA.getBookFromMap(booktitle);

您不能直接访问另一个 class 中定义的方法。

您需要做的是使用其构造函数初始化 class A 的实例,例如:

A myInstance = new A();

那么你就可以通过

访问classA里面的方法了
Book myBook = myInstance.getBookFromMap(booktitle);

An Alternative solution

通过使用 static :通常最好不要使用 static,但在这种情况下,它可能是更简单的方法。 (尽量避免静电,但必要时使用)

所以你需要将共享的东西定义为static:

在 A class 中你将拥有:

private static hashmap _books = new ConcurrentHashMap<String,Book>();


public static Book getBookFromMap(String title ){
    return _books.get(title);
} 

在 B class 中:

Book bookFromMap= A.getBookFromMap(booktitle); //accessing getBookFromMap method in class A

您需要创建 class A 的 实例 并通过该实例引用其 getBookFromMap

这就是 class A 的样子:

public class A
{
  private Map<String, Book> booksByTitle;

  public A(Book... books)
  {
    this.booksByTitle = new ConcurrentHashMap<>();

    for (Book book : books)
    {
      this.booksByTitle.put(book.getTitle(), book);
    }
  }

  public Book getBookForTitle(String title) throws BookNotFoundException
  {
    Book book = booksByTitle.get(title);

    if (book == null)
    {
      throw new BookNotFoundException("Book not found for title: " + title);
    }

    return book;
  }
}

虽然测试可能看起来像这样:

@Test
public void testGetBookForTitle() throws Exception
{
  Book warAndPeace = new Book("War & Peace")

  A a = new A(warAndPeace);

  assertEquals(warAndPeace, a.getBookForTitle(warAndPeace.getTitle));
}

@Test(expected = BookNotFoundException.class)    
public void testGetBookForInvalidTitle() throws Exception
{
  A a = new A();
  a.getBookForTitle("invalid");
}