当前位置: 首页 > 知识库问答 >
问题:

如何避免不同的方法循环相同的列表?

沈自珍
2023-03-14

我有一个从XML映射的类。为了简单起见,让我们想象这个类是这样的:

class Employee implements EmployeeIF {
    Map<AttributeIF,Object> attribute = new HashMap<>();
    @Override
    public Map<AttributeIF,Object> getAttributes() { return attribute; }
}

现在,现有的代码中充满了像这样的方法:

public int getSalary(EmployeeIF employee) {
    for(Entry<AttributeIF,Object> entry : employee.getAttributes()) {
        if(entry.getKey().getName().equals("salary")) return (Integer)entry.getValue();
    }
    return 0;
}

public int getAddress(EmployeeIF employee) {
    for(Entry<AttributeIF,Object> entry : employee.getAttributes()) {
        if(entry.getKey().getName().equals("address")) return (String)entry.getValue();
    }
    return "";
}

…等等。你肯定有这个想法。

我需要包含一个新的方法来从employee返回一个新的属性,但是由于我觉得这对mantain来说是可怕的,所以我拒绝在那里添加一个新的方法。我正在考虑使用action模式,以某种方式避免至少重复againg和for循环,但我不得不说,我找不到一个聪明的解决方案。

谢谢,Dani。

是的,我试过类似的事情

private Object getAttribute(EmployeeIF employee, String attribute)

共有1个答案

楚嘉玉
2023-03-14

这里有一个小例子,你可以如何获得,基于一个对象作为键,你没有,值。

public class TestObject {
    public String val;

    public TestObject(String val) {
        this.val = val;
    }

    public static TestObject createDummy(String val) {
        return new TestObject(val);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof TestObject)) return false;
        return ((TestObject)obj).val.equals(this.val);
    }

    @Override
    public int hashCode() {
        System.out.println("THIS ONE IS IMPORTANT");
        return val.hashCode();
    }
}

public class TestMap {
    public Map<TestObject, String> map = new HashMap<>();

    public String get(String keyVal) {
        return map.get(TestObject.createDummy(keyVal));
    }

    public static void main(String[] args) {
        TestMap map = new TestMap();
        TestObject o1 = new TestObject("A");
        map.map.put(o1,"B");
        TestObject o2 = new TestObject("B");
        map.map.put(o2,"C");
        TestObject o3 = new TestObject("C");
        map.map.put(o3,"D");
        System.out.println(map.get("B"));
    }
}

其关键是重写AttributeIf类中的equalsHashCode。因此,如果您传递的是您确实想要的AttributeIf的虚拟对象,则需要将该虚拟对象标识为与map中理论上“相等”的关键对象实例的实例相等。

 类似资料:
  • 问题内容: 我知道python中的循环导入问题已经出现过很多次了,我已经阅读了这些讨论。在这些讨论中反复提出的意见是,循环导入表明设计不良,应重新组织代码以避免循环导入。 有人可以告诉我在这种情况下如何避免循环导入吗?:我有两个类,并且我希望每个类都有一个构造函数(方法),该构造函数接受另一个类的实例并返回该类的实例。 更具体地说,一类是可变的,一类是不变的。哈希,比较等需要不可变的类。可变类也需

  • 问题内容: 在JavaFx中,我使用以下代码创建一个StackedBarChart: 结果是从1到8的系列具有不同的颜色。9-10系列与1-2系列具有相同的颜色。我试图在style.css文件中为条形图指定默认颜色,但似乎9-10系列实际上使用了颜色0和1。我认为这是一个错误。有谁知道解决方法? 问题答案: 颜色在8个系列之后被回收(原因是必须对定义的颜色数量进行一定的硬编码限制:JavaFX C

  • 我需要一些帮助。em以这种方式向活动添加片段。问题是每次调用openFragment时,它都会创建片段并添加。这是显而易见的。问:我做了什么修改,所以它只能添加一次片段。在下一次使用相同的片段标记调用时,它不会执行任何操作。 案例:第一次按下按钮添加片段并显示。我再按一次同样的按钮,它没有反应。

  • 异议是一个做出好决定的绝佳机会,但这需要被谨慎处理。你可能会觉得你充分的表达了你的想法,并且在决定做出前,你的意见已经被听取。这种情况下,没有什么可以再说的,你应该决定你是否要支持这个决定,即使你不同意它。如果你可以在自己不同意的情况下,支持这个决定,就这样说实话。这展示了你是多么有价值,因为你是独立的,不是一个唯唯诺诺之人,同时是一个尊重决定的团队成员。 有时候一个你不同意的决定,会在决策者没有

  • 是否可能有多个方法具有相同的名称,但采用不同的列表类型。这当然可以通过定期重写来实现,但java无法区分两种不同的列表类型。除了有不同的名字,还有别的办法吗?例如: 如果我们有 在同一个班级。

  • 大家好,我正在尝试在while循环中创建foreach循环。在foreach循环中,我试图生成包含div的列表元素,但我有非常奇怪的输出 这是我的密码 这是我的调试器consonle中的一个图像 正如你在图片中看到的,在ul标签中只存在一个li,其余的都在ul /ul. 我的第一个想法是,将div标记放在li标记中是无效的,但如果在文件的顶部使用它,则不是这样 DOCTYPE html PUBLI