профессиональное использование абстрактного класса для перевода - PullRequest
2 голосов
/ 21 сентября 2010

код ниже не дает мне ответа, который я хочу, я не знаю, в чем проблема?FR - это перевод EN (в точности как файл .properties). Я хочу прочитать перевод из файла FR.java, если я хочу получить переменную hello для fr.java или en.java со страницы index.jsp.но код, который я написал, дает мне значение из Lang.java

String language = "FR";

условие находится в файле .jsp jdk 1.4 выдает мне эту ошибку: Ошибка (23,23): переменная lang, возможно, не была инициализирована

может помочь любое тело, пожалуйста код?

имя файла Lang.java

package mypackage;

abstract public class Lang {
  public String hello= "home page";
}

имя файла EN.java

package mypackage;

public class EN extends Lang {
  public String hello = "hello";
}

имя файла FRjava

package mypackage;

public class FR extends Lang {
  public String hello = "bonjour";
}

имя файла: index.jsp

<%@ page contentType="text/html;charset=windows-1252"%>
<%@ page import="mypackage.Lang" %>
<%@ page import="mypackage.FR" %>
<%@ page import="mypackage.EN" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

    <title>language</title>
  </head>
  <body>
    <%
      String language = "EN";
      Lang lang;
      if (language.equals("EN")){
        lang = new EN();
        }
      else if (language.equals("FR")){
        lang = new FR();
      }
    %>
    <%
      out.print(lang.hello);
    %>
  </body>
</html>

Ответы [ 6 ]

1 голос
/ 21 сентября 2010

Ваш код не соответствует случаю, когда language не является ни "EN", ни "FR". Выберите язык по умолчанию, чтобы переменная lang всегда была инициализирована:

Lang lang;
if (language.equals("EN")){
    lang = new EN();
}
else // default case
    lang = new FR();
}

Кроме того, вместо объявления одного атрибута для каждой строки, которую необходимо перевести (например, String home), рассмотрите возможность объявления метода, который будет принимать «ключ» в качестве параметра, и возвращать соответствующий перевод для этого ключа. Например, в вашем JSP вы можете использовать что-то вроде этого:

out.print(lang.getString("home"));

Затем все ваши подклассы Lang возвращают правильное переведенное значение для каждого ключа.

Возможно, вы также захотите взглянуть на ResourceBundles .

1 голос
/ 21 сентября 2010

Измените условие следующим образом:

if (language.equals("FR")){
    lang = new FR();
}
// add more languages here
// example:
// else if (language.equals("DE")) {
//     lang = new DE();
// }
else {
    lang = new EN();
}
1 голос
/ 21 сентября 2010
<%
      String language = "EN";
      Lang lang;
      if (language.equals("EN")){
        lang = new EN();
        }
      else if (language.equals("FR")){
        lang = new FR();
      }
    %>  

Здесь может быть случай, когда язык остается не инициализированным, поэтому вам нужно инициализировать его

скажем

Lang lang = null;//or any default value   

И для инициализации локальной переменной обязательно

Я не понимаю, насколько важно это условие, когда вы назначаете "EN" языку, тогда зачем нужно условие?

0 голосов
/ 21 сентября 2010

Если вы хотите напечатать переменную hello, объявите эту переменную в абстрактном классе Lang и инициализируйте в конкретных классах.

package mypackage;

abstract public class Lang {
  public String hello= "home page";
}

имя файла EN.java

package mypackage;

public class EN extends Lang {
   {
      hello = "hello";
   }
}

имя файла FR.java

package mypackage;

public class FR extends Lang {
     {
      hello = "bonjour";
   }
}
0 голосов
/ 21 сентября 2010

Установить значение по умолчанию для переменной lang:

Lang lang = new EN();
 if (language.equals("EN")){
     lang = new EN();
 }
 else if (language.equals("FR")){
    lang = new FR();
 }
0 голосов
/ 21 сентября 2010

Если language не равно EN или FR, то Lang lang не будет инициализировано. Установите явно в new EN() перед if.

...