Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有单例模式和静态方法的多个子类&;变量_Java_Design Patterns_Static_Abstract Class_Subclass - Fatal编程技术网

Java 具有单例模式和静态方法的多个子类&;变量

Java 具有单例模式和静态方法的多个子类&;变量,java,design-patterns,static,abstract-class,subclass,Java,Design Patterns,Static,Abstract Class,Subclass,首先对不起我的英语,我可以尽我所能解释这个问题 问题 我有多个类,从唯一的XML文件中读取更多字符串 所有这些分类都从同一个文件读取,但变量不同。因为每个类读取文档的不同部分 这个变量我想用“static”。因为我不想每次使用这个类时都实例化 我使用这些类来“动态”返回URL。我在表单、链接、JSP和“request.getRequestDispatcher(#))中使用这些URL 这就是为什么使用“静态”方法不在JSP/Servlet中实例化类,而是可以直接使用它的原因。(代码更简单、更清晰)

首先对不起我的英语,我可以尽我所能解释这个问题

问题

我有多个类,从唯一的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);
        }
    }