gpt4 book ai didi

java - 具有单例模式和静态方法和变量的多个子类

转载 作者:行者123 更新时间:2023-12-02 06:17:26 25 4
gpt4 key购买 nike

首先对我的英语感到抱歉,我可以尽力解释这个问题。

问题

我有多个类,可以从唯一的 XML 文件中读取更多字符串。

所有这些类都从同一个文件中读取,但变量不同。因为每个类读取文档的不同部分。

这个变量我想使用“静态”。因为我不想每次使用该类时都实例化。

我使用这些类返回“动态”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”,让每个类读取它们的 XML 部分。

但我认为还有另一种方法可以做到这一点。因为我认为我可以重用代码而不用每个类都重新编写

我尝试过的事情

生成一个包含此代码的抽象类。其他类“扩展”了这一点。

失败:

由于“父”类具有静态方法,因此这些方法不会被替换。并且变量始终具有相同的值。

可能的解决方案我读到了“工厂模式”,但如果它解决了我的问题,那就不是,这基本上是为每个类重新编写代码,并且如果我进行更改,则更容易维护

我试图想出一种方法来做到这一点,但我想不出比以前测试过的更好的方法

编辑

这是 XML 文件:

http://pastebin.com/aXS0aCxP

  • 我使用大写字母作为变量名称,因为它们是“静态的”,并且我用它来将其与其他变量分开。通常我使用java命名法
  • XML 文件包含 Web 应用程序 URL 以及有关 Web 应用程序的其他信息(域、端口等)。仅此信息发生变化 (paginasGlobales)

如果有人需要进一步的解释或更好的解释(我的英语不好),我会尝试再次更清楚地解释

最佳答案

我会使用HashMap来存储产品。如果您需要添加新产品,只需在 productos 中添加新值即可。您可以发布您的 XML 文件吗?

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)
}

}

编辑

根据您提供的 XML(下面的代码片段),您的代码可以得到简化。

  <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>

重构后的代码不需要了解productos 。只需将另一个子元素添加到 <paginasProductos>标签将产生一个新的 producto .

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);
}

}

现在您创建 Paginas 的实例对于 XML 文件中的每个组。也许您可以使用 PaginasManager 将它们全部放在一起。

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);
}
}

关于java - 具有单例模式和静态方法和变量的多个子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21320921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com