Java 具有单例模式和静态方法的多个子类&;变量
首先对不起我的英语,我可以尽我所能解释这个问题 问题 我有多个类,从唯一的XML文件中读取更多字符串 所有这些分类都从同一个文件读取,但变量不同。因为每个类读取文档的不同部分 这个变量我想用“static”。因为我不想每次使用这个类时都实例化 我使用这些类来“动态”返回URL。我在表单、链接、JSP和“request.getRequestDispatcher(#))中使用这些URL 这就是为什么使用“静态”方法不在JSP/Servlet中实例化类,而是可以直接使用它的原因。(代码更简单、更清晰) 课程示例:Java 具有单例模式和静态方法的多个子类&;变量,java,design-patterns,static,abstract-class,subclass,Java,Design Patterns,Static,Abstract Class,Subclass,首先对不起我的英语,我可以尽我所能解释这个问题 问题 我有多个类,从唯一的XML文件中读取更多字符串 所有这些分类都从同一个文件读取,但变量不同。因为每个类读取文档的不同部分 这个变量我想用“static”。因为我不想每次使用这个类时都实例化 我使用这些类来“动态”返回URL。我在表单、链接、JSP和“request.getRequestDispatcher(#))中使用这些URL 这就是为什么使用“静态”方法不在JSP/Servlet中实例化类,而是可以直接使用它的原因。(代码更简单、更清晰)
public class PaginasProductos {
Logger log = LoggerFactory.getLogger(getClass());
// URL donde se encuentran las paginas
private static String PATH;
// URL para las acciones
private static String RealPath = PaginasGlobales.getPATH();
//Paginas
private static String PaginaListados;
private static String FormularioModificar;
private static String FormularioAlta;
// Acciones = Servlets
private static String AccionAlta;
private static String AccionBaja;
private static String AccionListar;
private static String AccionModificar;
private static String AccionObtener;
// Instancia de la clase
private static PaginasProductos INSTANCIA;
/**
* Devuelve las URL de las paginas especificas de administracion de productos
* @return Una instancia con todas las URL de las paginas
*/
public static PaginasProductos getInstance(){
if (INSTANCIA == null) INSTANCIA = new PaginasProductos();
return INSTANCIA;
}//Final del metodo, getInstance
private PaginasProductos(){
String rutaTotal = InicializadorXML.getRutaXmlPaginas();
SAXBuilder constructor = new SAXBuilder();
File xml = new File(rutaTotal);
try{
Document documento = (Document) constructor.build(xml);
Element root = documento.getRootElement();
List<Element> listado = root.getChildren("paginasProductos");
for (int contador = 0; contador < listado.size(); contador++){
Element parametro = (Element) listado.get(contador);
PATH = parametro.getChildText("path");
PaginaListados = PATH+parametro.getChildText("listado");
FormularioModificar = PATH+parametro.getChildText("formularioMod");
FormularioAlta = RealPath+PATH+parametro.getChildText("formularioAlta");
AccionAlta = RealPath+parametro.getChildText("alta");
AccionBaja = RealPath+parametro.getChildText("baja");;
AccionListar = RealPath+parametro.getChildText("listar");
AccionModificar = RealPath+parametro.getChildText("modificar");
AccionObtener = RealPath+parametro.getChildText("obtener");
}
}catch (IOException e) {
log.error("Ex (IOException | Constructor | PaginaProductos): " + e.getMessage());
log.error("¡traza!", e);
}catch (JDOMException e) {
log.error("Ex (IOException | Constructor | PaginaProductos): " + e.getMessage());
log.error("¡traza!", e);
}catch (Exception e) {
log.error("Ex (Exception | Constructor | PaginaProductos): " + e.getMessage());
log.error("¡traza!", e);
}
} //Fin Constructor PaginasClientes
@SuppressWarnings("javadoc")
public static String getPaginaListados() {
return PaginaListados;
}
@SuppressWarnings("javadoc")
public static String getFormularioModificar() {
return FormularioModificar;
}
@SuppressWarnings("javadoc")
public static String getFormularioAlta() {
return FormularioAlta;
}
@SuppressWarnings("javadoc")
public static String getAccionAlta() {
return AccionAlta;
}
@SuppressWarnings("javadoc")
public static String getAccionBaja() {
return AccionBaja;
}
@SuppressWarnings("javadoc")
public static String getAccionListar() {
return AccionListar;
}
@SuppressWarnings("javadoc")
public static String getAccionModificar() {
return AccionModificar;
}
@SuppressWarnings("javadoc")
public static String getAccionObtener() {
return AccionObtener;
}} //Fin Clase PaginasClientes
公共类PaginasProductos{
Logger log=LoggerFactory.getLogger(getClass());
//帕吉纳斯东区
私有静态字符串路径;
//阿奇奥尼斯酒店
私有静态字符串RealPath=PaginasGlobales.getPATH();
//帕吉纳斯
私有静态字符串PaginaListados;
私有静态字符串公式化修改器;
私有静态字符串formularoalta;
//Acciones=Servlets
私有静态字符串AccionAlta;
私有静态字符串AccionBaja;
私有静态字符串AccionListar;
私有静态字符串AccionModificar;
专用静态字符串附件;
//克拉斯海滩酒店
私有静态Paginasos INSTANCIA;
/**
*根据产品管理的特殊性,确定产品的URL
*@return Una instancia con todas las URL de las paginas
*/
公共静态PaginasProductos getInstance(){
如果(INSTANCIA==null)INSTANCIA=new PaginasProductos();
返回瞬间;
}//最后一个del metodo,getInstance
私有PaginasProductos(){
字符串rutaTotal=InicializadorXML.getRutaXmlPaginas();
SAXBuilder构造函数=新SAXBuilder();
文件xml=新文件(rutaTotal);
试一试{
Document documento=(Document)constructor.build(xml);
Element root=documento.getRootElement();
List listado=root.getChildren(“paginasProductos”);
对于(int-contador=0;contador
现在我所做的是相同的代码,替换了“PaginaProductOS”,因为每个类都读取它们的XML部分
但我认为还有另一种方法可以做到这一点。因为我认为我可以重用代码,而不必对每个类都重新编写
我尝试过的事情
生成包含此代码的抽象类。其他类别“扩展”了这一点
失败:
由于“父”类具有静态方法,因此这些方法不会被替换。变量总是有相同的值
可能的解决方案
我读过关于“工厂模式”的书,但没有读到它是否解决了我的问题,这基本上是为每个类重新编写代码,如果我做了更改,它会更容易维护
我试图想出一种方法来做这件事,但我想不出比之前测试的更好的方法
编辑
这是XML文件:
- 我使用大写字母来表示变量名,因为它们是“静态”的,我用它来将它与其他变量分开。通常我使用java术语
- XML文件包含webapp URL和有关webapp的其他信息(域、端口等)。仅此信息更改(paginasGlobales)
如果有人需要进一步解释或更好的解释(我的英语不好),我会尝试再次解释,并且解释得更清楚因为您当前的方法包含一系列反模式,我将从一些一般考虑开始。这并不能解决你的问题,但可能会指引你前进的方向。缺少一些基本信息,但根据代码,我将做出以下假设:
- 您正在开发Web应用程序(*.war)
- 你想缓存信息吗
public class PaginasProductos { private HashMap<String,String> paginasProductos; private String[] productos = {"listado", "formularioMod", ...}; ..... public PaginasProductos(){ String rutaTotal = InicializadorXML.getRutaXmlPaginas(); SAXBuilder constructor = new SAXBuilder(); File xml = new File(rutaTotal); try{ Document documento = (Document) constructor.build(xml); Element root = documento.getRootElement(); List<Element> listado = root.getChildren("paginasProductos"); PATH = parametro.getChildText("path"); for (int contador = 0; contador < listado.size(); contador++){ Element parametro = (Element) listado.get(contador); for(String producto:productos){ paginasProductos.put(producto, PATH+parametro.getChildText(producto)); } } } } public String getProducto(String producto){ return paginasProductos.get(producto) } }
<paginasProductos> <path>administracion/productos/</path> <listado>gestionProductos.jsp</listado> <formularioMod>formularioModificarProducto.jsp</formularioMod> <formularioAlta>formularioAltaProducto.jsp</formularioAlta> <alta>AltaProducto</alta> <baja>BajaProducto</baja> <listar>ListarProductos</listar> <modificar>ModificarProducto</modificar> <obtener>ObtenerProducto</obtener> </paginasProductos>
public class PaginasProductos { private HashMap<String,String> paginasProductos; ..... public PaginasProductos(){ String rutaTotal = InicializadorXML.getRutaXmlPaginas(); SAXBuilder constructor = new SAXBuilder(); File xml = new File(rutaTotal); try{ Document documento = (Document) constructor.build(xml); Element root = documento.getRootElement(); List<Element> listado = root.getChildren("paginasProductos"); PATH = parametro.getChildText("path"); for (int contador = 0; contador < listado.size(); contador++){ Element parametro = (Element) listado.get(contador); paginasProductos.put(parametro.getTagName(), PATH+parametro.getChildText(producto)); } } } public String getProducto(String producto){ return paginasProductos.get(producto) } }
public class Paginas { private HashMap<String,String> paginas; ..... // sectionName = "paginasProductos", etc. public Paginas(String sectionName ){ String rutaTotal = InicializadorXML.getRutaXmlPaginas(); SAXBuilder constructor = new SAXBuilder(); File xml = new File(rutaTotal); try{ Document documento = (Document) constructor.build(xml); Element root = documento.getRootElement(); List<Element> listado = root.getChildren(sectionName ); PATH = parametro.getChildText("path"); for (int contador = 0; contador < listado.size(); contador++){ Element parametro = (Element) listado.get(contador); paginas.put(parametro.getTagName(), PATH+parametro.getChildText(producto)); } } } public String getPaginas(String page){ return paginas.get(page); } }
public class PaginasManager{ private HashMap<String,String> paginasSections; .... public PaginasManager(String[] sectionNames){ for(String sectionName:sectionNames){ paginasSections.put(sectionName, new Paginas(sectionName)); } } public String getPaginas(String section, String page){ return paginasSections.get(section).get(page); } }