我有不同的类,它们的结构如下:
public class MyClass {
private String name;
private List<International> internationalList;
}
我想要的是有一个通用方法,它在 internationalList 中搜索给定本地化(例如:“en-us”)并使用正确的语言设置名称。
示例:
public MyClass myMethod(String local, MyClass object){
for (International international : object.internationalList){
if(local.equals(international.language)){
object.name = international.translation
}
}
return myObject;
}
我不想为每个类(class)重新编写这段代码。是否可以创建适用于所有具有此结构的类的通用方法?
最佳答案
定义接口(interface)
您可以创建一个将由MyClass
实现的接口(interface)
public interface LocationAware {
String getName();
void setName(String name);
List<International> getInternationals();
void setInternationals(List<International> internationals);
}
然后像这样实现类
public static class MyClass implements LocationAware {
private String name;
private List<International> internationalList;
// getter and setters
}
您还可以使用International
的接口(interface)并实现该类。
public interface International {
String getLanguage();
String getTranslation();
}
使用辅助方法
你可以在任何你想要的类中使用带有泛型的辅助方法,例如静态类
。
public static <T extends LocationAware> T changeLocationName(String local, T object) {
for (International international : object.getInternationals()) {
if(local.equals(international.getLanguage())) {
object.setName(international.getTranslation());
}
}
return object;
}
可以这样调用:
StaticClass.changeLocationName("en-us", myClass);
使用默认方法
由于您已经在使用一个接口(interface),因此您可以拥有一个默认方法,它在没有辅助方法的情况下为您提供相同的功能。
public interface LocationAware {
default void changeLocationName(String local) {
for (International international : getInternationals()) {
if(local.equals(international.getLanguage())) {
setName(international.getTranslation());
}
}
}
String getName();
void setName(String name);
List<International> getInternationals();
void setInternationals(List<International> internationals);
}
只需使用类方法:
MyClass myClass = new Myclass(); // create and add name and internationals
myClass.changeLocationName("en-us"); // then change the location
在这里你可以决定如何处理 local
的许多其他方式,例如,你可以存储值,当你使用 getName()
时,返回当前值动态命名,因此您不必每次都更改当前名称(也可以使用 map 来获得很少的性能提升)。
public interface LocationAware {
default String getName() {
return getInternationals().get(getLocal());
}
void setName(String local);
String getLocal();
void setLocal(String local);
Map<String, International> getInternationals();
void setInternationals(Map<String, International> internationals);
}
注意:你应该处理位置不存在的情况
关于java - 是否可以创建一个适用于 Java 中不同类的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49519636/