我的Servlet看起来像这样:
public class MyServlet extends Servlet {
private class Page {
private Page(HttpServletRequest request, HttpServletResponse response) {
/* Do stuff */
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
Page page = new Page(request, response);
/* Do other stuff */
}
}
我还有一个看起来像这样的缓存:
public class Cache {
private Hashtable<String, CacheValue>;
public Cache() {
Hashtable<String, CacheValue> table = new Hashtable()<String, CacheValue>;
}
public void put(String key, String value) {
table.put(key, new CacheValue(value));
}
private class CacheValue {
private value;
private CacheValue(String value) {
this.value = value;
}
}
}
我的问题是:以这种方式使用私有嵌套类有什么问题吗?我知道您通常在单独的文件中有一个单独的公共类,但CacheValue
只能使用Cache
。 Page
仅使用MyServlet
。以这种方式组织课程对我来说很有意义,但我不是Java的老职业,所以我对利弊感兴趣。
使用嵌套类通常被认为是一种风格问题吗?还是偏好?还是要避免的事情?还是一种降低复杂性的工具?
答案 0 :(得分:3)
不,保持私密性并没有错。
当代码不易访问时,更少的东西依赖于它,这使您可以更自由地进行修改。
但是,您应该声明您的CacheValue
和Page
类static
,因为它们不会访问封闭实例的任何成员。
答案 1 :(得分:2)
我的问题是:以这种方式使用私有内部类有什么问题吗?我知道你通常在一个单独的文件中有一个单独的公共类,但CacheValue只能由Cache使用。
这没什么不对。 Page
类是一个私有的嵌套类。根据定义,嵌套类与其封闭类存在于同一文件中。
这很好,通常在servlet的上下文中。如果(例如)私有类或其成员的可见性存在问题,那么编译器会告诉您。
修改强>
使用嵌套类通常被认为是一种风格问题吗?还是偏好?
很难说哪个。我想,适当使用嵌套类是很好的风格,特别是如果你不需要非静态时声明它们static
。但是,我不认为规范的Java风格指南会提到它。
还是要避免的事情?
没有
还是降低复杂性的工具?
是的......有点儿。我倾向于将嵌套类(尤其是私有嵌套类)视为模块化机制。它并没有降低“圈复杂度”意义上的复杂性,但它确实有助于隐藏/关闭实现细节。
答案 2 :(得分:0)
只要这些函数的唯一调用发生在该类中,你就不应该将它们设置为私有。