我有一个问题,如果可能的话,如何通过提供特定类型的变量来自动生成方法。
让我们用简单的例子说明我的问题: 假设我有多个链接到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循环并将其概括为任意元素不起作用。
答案 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的属性,那么这只是非常明智。