professional usage of abstract class for translation

谁都会走 提交于 2020-01-24 12:27:06

问题


the code below is not giving me the answer i want, i don't know where is the problem? FR is the translation of EN (exactly like .properties file) i want to read the translation from the FR.java file if i want to reach the hello variable of fr.java or en.java from the index.jsp page. but code i wrote gives me the value from Lang.java

String language = "FR";

the condition is in the .jsp file jdk 1.4 gives me this error :Error(23,23): variable lang might not have been initialized

any body can help, code pleas?

file name Lang.java

package mypackage;

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

filename EN.java

package mypackage;

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

filename FR.java

package mypackage;

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

file name : 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>

回答1:


Change the condition as follows:

if (language.equals("FR")){
    lang = new FR();
}
// add more languages here
// example:
// else if (language.equals("DE")) {
//     lang = new DE();
// }
else {
    lang = new EN();
}



回答2:


Your code does not cater with the case where language is neither "EN" nor "FR". Pick a default language so that the lang variable is always initialised:

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

In addition, instead of declaring one attribute for each string that needs to be translated (e.g. String home) consider declaring a method that will take a "key" as a parameter, and return the corresponding translation for that key. For example, in your JSP you could use something like this:

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

Then have all your Lang subclasses return the proper, translated value for each key.

You might also want to have a look at ResourceBundles.




回答3:


<%
      String language = "EN";
      Lang lang;
      if (language.equals("EN")){
        lang = new EN();
        }
      else if (language.equals("FR")){
        lang = new FR();
      }
    %>  

Here it can be the case where language stays un initialized so you need to initialize it

say

Lang lang = null;//or any default value   

And to initialize local variable is compulsary

I don't understand the importance of this condition here you are assigning "EN" to language then what is the need of condition?




回答4:


If language is not equals to EN or FR then Lang lang will not be initialized. Set it explicitly to new EN() before the if.




回答5:


Set a default value for the lang variable:

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



回答6:


If you wanted to print hello variable, declare that variable in abstract Lang class and initialize in concrete classes.

package mypackage;

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

filename EN.java

package mypackage;

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

filename FR.java

package mypackage;

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


来源:https://stackoverflow.com/questions/3759950/professional-usage-of-abstract-class-for-translation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!