自动为变量生成某些方法

时间:2017-09-27 11:22:31

标签: java variables methods automation

我有一个问题,如果可能的话,如何通过提供特定类型的变量来自动生成方法。

让我们用简单的例子说明我的问题: 假设我有多个链接到LinkedLists的变量,我想给出每个特定的方法;例如setter和getters方法:

private LinkedList football = new LinkedList();
private LinkedList jogging = new LinkedList();

public LinkedList getFootball() {
    return football;
}
public void setFootball(LinkedList football) {
    this.football = football;
}
public LinkedList getJogging() {
    return jogging;
}
public void setJogging(LinkedList jogging) {
    this.jogging = jogging;
}

如果变量的数量变长(例子只包含2个),这将产生非常长且相当重复的代码和平,如上所示。

有没有办法,如果这确实是一种可能性,可以概括上述模式,这样我就可以通过创建LinkedList的实例来创建这两种方法?

P.S。:使用foreach循环并将其概括为任意元素不起作用。

5 个答案:

答案 0 :(得分:7)

您可能正在寻找Lombok

  

您可以使用@Getter和/或@Setter注释任何字段,让lombok自动生成默认的getter / setter。

     

默认的getter只返回字段,如果字段名为foo,则命名为getFoo(如果字段的类型为布尔值,则命名为isFoo)。

在你的情况下,这个班级

@Getter
@Setter
public class MyClass {
    private LinkedList football = new LinkedList();
    private LinkedList jogging = new LinkedList();
}

将导致以下代码:

public class MyClass {
    private LinkedList football = new LinkedList();
    private LinkedList jogging = new LinkedList();

    public LinkedList getFootball() {
        return football;
    }

    public void setFootball(LinkedList football) {
        this.football = football;
    }

    public LinkedList getJogging() {
        return jogging;
    }

    public void setJogging(LinkedList jogging) {
        this.jogging = jogging;
    }
}

然而,龙目岛requires some compiler configuration,所以当你正在考虑它时,你可以考虑查看Kotlin,你的课程可以简单地写成:

class MyClass {
    var football = LinkedList<Any?>()
    var jogging = LinkedList<Any?>()
}

答案 1 :(得分:6)

您无法在运行时执行此操作。但是,很多IDE都可以选择自动生成getter和setter。

例如在Eclipse中,左键单击打开上下文菜单,在“Source”下查看,或按 Alt + Shift + s 打开源菜单。在那里你会找到一个标有“Generate Getters and Setters”的选项,它会打开一个对话框按钮,让你选择要创建的setter和getters,在代码中将它们插入的位置等。

答案 2 :(得分:4)

您要求various sorts of trouble具有代码可读性,优化和丢失封装,更不用说丢失正确变量名称的编译时检查。无论如何,您可以通过这样的反射创建一个通用的setter和getter(在本例中为LinkedLists):

 public void setter(String name, LinkedList value) throws IllegalArgumentException {
    try {
      Field field = getClass().getDeclaredField(name);
      field.setAccessible(true);
      field.set(this, value);
      field.setAccessible(false);
    } catch (NoSuchFieldException | IllegalAccessException e) {}
  }

  public LinkedList getter(String name) {
    LinkedList ret = null;
    try {
      Field field = getClass().getDeclaredField(name);
      field.setAccessible(true);
      Object object = field.get(this);
      if (object instanceof LinkedList) {
        ret = (LinkedList) object;
      }
      field.setAccessible(false);
    } catch (NoSuchFieldException | IllegalAccessException e) {
      e.printStackTrace();
    }
    return ret;
  }

答案 3 :(得分:0)

为什么不使用地图来整理您的列表?我为你制作了一个可运行的例子:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

public class ListsManager {

    Map<String, LinkedList<String>> lists;

    public static void main(String[] args) {
        ListsManager lm = new ListsManager();
        System.out.println(lm.getList("football"));
    }

    public ListsManager(){
        //initialize map
        lists = new HashMap<String, LinkedList<String>>();
        //add lists
        lists.put("football", new LinkedList<String>());
        lists.put("jogging", new LinkedList<String>());
        //fill lists with objects
        lists.get("football").add("football 1");
        lists.get("football").add("football 2");
        lists.get("jogging").add("jogging 1");
        lists.get("jogging").add("jogging 2");
    }

    public void setList(String id, LinkedList list){
        lists.put(id, list);
    }

    public LinkedList getList(String id){
        return lists.get(id);
    }

}

这样您就可以通过ID来处理列表。 该示例打印[football 1, football 2]

编辑:我使用了字符串列表 - 当然,您可以将泛型更改为您想要的任何内容。

答案 4 :(得分:0)

如果你需要这样的话,我建议你使用Apache DynaBean。 它本质上是围绕地图的包装器。 但是,如果您在编译时不知道bean的属性,那么这只是非常明智。