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");
}
我有两个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");
}