4

我有一个与在 Java 中实现某些东西有关的问题,我猜 Enums 是其中的一部分(或者也许只是我让它们成为问题的一部分。

所以问题是我有一个模型类,可以说它有 3 个字段:

class ConferenceInfo {
    String name;
    Date date;
    String location;

    public boolean compareByName(ConferenceInfo other) {
        return getName().equals(other.getName());
    }

    public boolean compareByDate(ConferenceInfo other) {
        return getDate().compareTo(other.getDate()) == 0;
    }

    public boolean compareByLocation(ConferenceInfo other) {
        return getLocation().equals(other.getLocation());
    }
}

我有一个必须比较的对象对的列表:

List<Pair<ConferenceInfo, ConferenceInfo>> 

现在,如果我可以重写一个 equals 方法,这将非常容易,但在这种情况下它有点不同 - 我必须通过它们的字段值比较这些对象并输出它们不同的数量。为此,我创建了一个枚举:

public enum FieldType {
    NAME,
    DATE,
    LOCATION
}

并创建了一个将 FieldType 作为参数并执行以下操作的方法(在我的 Measurement 类中,具有上述对列表):

for (Pair<ConferenceInfo, ConferenceInfo> result : results) {
    ConferenceInfo first = result.getFirst();
    ConferenceInfo second = result.getSecond();

    switch (field) {
    case NAME:
        if (!first.compareByName(second)) {
            differentValues++;
        }
        break;
    case DATE:
        if (!first.compareByDate(second)) {
            differentValues++;
        }
        break;
    case LOCATION:
        if (!first.compareByLocation(second)) {
            differentValues++;
        }
        break;
    }
}

它有效,但我想知道我编码它的方式是否是一个好习惯,或者我应该用不同的方式编写它。我有点不喜欢在循环内切换,但也许只是我:)

4

2 回答 2

4

您可以使用多态性而不是您的开关:

public enum FieldType {
    NAME {
        @Override
        public boolean areEqual(ConferenceInfo c1, ConferenceInfo c2) {
            return c1.compareByName(c2);
        }
    },
    DATE {
        @Override
        public boolean areEqual(ConferenceInfo c1, ConferenceInfo c2) {
            return c1.compareByDate(c2);
        }
    },
    LOCATION {
        @Override
        public boolean areEqual(ConferenceInfo c1, ConferenceInfo c2) {
            return c1.compareByLocation(c2);
        }
    };

    public abstract boolean areEqual(ConferenceInfo c1, ConferenceInfo c2);
}

然后,在您的代码中:

for (Pair<ConferenceInfo, ConferenceInfo> result : results) {
    ConferenceInfo first = result.getFirst();
    ConferenceInfo second = result.getSecond();
    if (!field.areEqual(first, second)) {
        differentValues++;
    }
}

这还有一个额外的好处,即如果出现新的枚举值,您将不会有忘记在开关中添加大小写的风险。

于 2013-05-07T22:19:21.183 回答
-1

不确定我是否遗漏了什么,但在这种情况下,我将在 simplemodel 类中实现一个方法并检查不同的值:

class SimpleModel  {
     ...

    int differentFields(SimpleModel obj){
        int differentValues = 0;
        if (!this.compareByName(obj)) {
            differentValues++;
        }
        if (!first.compareByDate(second)) {
             differentValues++;
        }
        if (!first.compareByLocation(second)) {
            differentValues++;
        }
        return differentValues;
    }
}

并在比较对的方法中,使用它

for (Pair<ConferenceInfo, ConferenceInfo> result : results) {
    ConferenceInfo first = result.getFirst();
    ConferenceInfo second = result.getSecond();
    first.differentFields(second);
}
于 2013-05-07T22:12:44.750 回答