在Java中可识别地存储方法

在Java中可识别地存储方法,java,methods,storage,Java,Methods,Storage,我正试图找到一个解决方案,解决一个问题:我想以某种方式存储方法引用,以便在需要时调用它们,在方法列表中不需要它们时删除它们 这里的基本目标如下: 我有个人课: public class Person { private String ref, name; private String fatherRef; // can be reference string (such as "#1#") or a literal text (such as "th

我正试图找到一个解决方案,解决一个问题:我想以某种方式存储方法引用,以便在需要时调用它们,在方法列表中不需要它们时删除它们

这里的基本目标如下:

我有个人课:

public class Person {
    private String ref, name;
    private String fatherRef; // can be reference string (such as "#1#") or a literal text (such as "the guy next door")

    public Person(String ref, String name) {
        this.ref = ref;
        this.name = name;
    }

    public String getFatherRef() {return fatherRef;}

    public void setFatherRef(String ref) {
        fatherRef = ref;
    }

    ...
}
我制作了两个父子实例,并使用setFatherRef方法将父亲的ref设置为儿子的fatherRef。我把它们都列在一张单子上。现在假设父亲的对象已从系统中删除,他的ref可供其他人使用。为了确保在儿子的对象被删除后,父亲没有被引用,我提出了以下建议:

我制作了一个
接口IRefSetter{public void setRef(String ref);}
并用它制作了一个
ArrayList
方法(例如
setFatherRef
setMotherRef
等)并使用父亲的ref将该列表映射到
HashMap
上,这样每当我摆脱任何人时,我都可以查看他们的ref,看看它是否映射到一个方法列表,我可以使用该列表将所有其他
人的ref设置为null或“”

在本例中,映射将只有一个父亲的ref到一个列表的映射,该列表包含一个引用
setFatherRef
from
Person
类的方法。现在,这将很好地工作,但假设我将fatherRef设置为其他人的ref,并以与原始父亲相同的方式为新成员添加方法引用。但现在我只剩下一个
HashMap
,在原始父亲的ref下包含一个列表,其中存储了一个方法,如果原始父亲被删除,可以重置儿子的父亲ref。但这已经没有必要了,因为儿子现在有了不同的父亲和不同的裁判

我无法找到一种简单的方法来识别列表中的哪个方法是
son::setFatherRef
,因为每次我引用该方法时创建的lambda函数是不同的

从那时起,我开始寻找一种非常丑陋的解决方案,在这种解决方案中,我存储的不是与原始
IRefSetter
接口匹配的lambda函数,而是一个
对象
引用(在本例中)son的
Person
实例和方法名(作为
字符串
),并尝试手动将正确的方法与我的
IRefSetter
接口匹配(使用
Class
method
classes)。但这是一个非常丑陋的解决方案,它会产生运行时错误,而不是编译器错误,这是我不喜欢的,而且对我来说,整个过程似乎不是很OOP


我是否缺少更好的解决方案?

更好的解决方案是:

public class Person {
    private String ref, name;
    private Person father;
    private List<Person> children;

    ... a lot of obvious stuff here ...
}
公共类人物{
私有字符串ref,name;
私人父亲;
私人名单儿童;
…这里有很多明显的东西。。。
}
现在,当您删除一个
时,您可以查看该人的
父亲
,然后从父亲的
子女
列表中删除
,还可以查看被删除人的
子女
,并将每个人的
父亲
设置为空。如果您想知道父亲的ref,只需执行
father.ref
getFather().getRef()

我感觉你不想这样做是出于某种原因,比如说它很脏或者不是OOP之类的。但这是最好地利用语言和运行库功能的解决方案

其他解决方案往往只是更复杂的方法。在您的示例中,您创建了一个单独的
HashMap
,其中键是父ref,值是setter方法数组,而不是
子成员,但是您看到这是一样的:对于每个子-父关系,列表中都有一个与父关联的条目


如果您坚持setter策略,一种避免意外清除不再指向被删除人员的父亲的简单方法是检查父亲字段是否仍指向该人员。setter方法仍将在列表中,并且仍将被调用,但是它不会造成任何损害。

您考虑过使用对象而不是字符串引用吗?
消费者如何我不熟悉WeakReference。这种方法的问题是,我忘了提到ref string是字符串,因为它也可以保存文本。例如:儿子的父亲可以是:“#1#”(指不同的人的参考字符串)或“隔壁的家伙”,我不知道你这是什么意思;如果它是
字符串
,则它必须包含文本。你是说有时候
ref
值并不指内存中的
?如果
fatherRef
字段设置为“隔壁的家伙”,是否有
Person
ref
相等的
Person
?你怎么知道你什么时候删除了“隔壁的家伙?”其他地方我把人存储在一个
哈希图中,人是这样存储的:
personStorage.put(person.getRef(),person)
所以看起来是这样的:
personStorage.put(“#1#”,父亲)
查看儿子的父亲参考号,然后我可以确定字符串是否与参考号匹配。我去从个人存储中获取此人并使用其姓名,否则我使用父亲参考号中的文字。不,没有人使用参考号“隔壁的家伙”。它应该在那里,所以我不必每次在某个地方提到这个名字的人时都创建一个新的人,而且我事先也不知道是不是同一个人。因此,我只存储文本,而不必存储用户需要的所有其他内容。