java - 是否可以创建一个适用于 Java 中不同类的泛型方法?

标签 java generics java-8 code-reuse

我有不同的类,它们的结构如下:

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/

相关文章:

java - Hibernate 在查询时没有响应

java - 错误 - trustAnchors 参数必须非空

java - 无法添加依赖 : Failed to resolve: androidx. 生命周期 :lifecycle-extensions:2. 2.0-rc2

java - 将 List<Subclass> 传递给需要 List<SuperClass> 的方法

Java 8 多级 flatMap 最佳实现

java - 添加有关新主机的信息

java - 在 Matlab 中使用 Java 泛型类

java - 更正泛型类型以将对象添加到方法中的列表

java - Java8容器 `for each`和Stream `for each`有什么区别

java - 使用 java 8 的设计模式建议/实现