2

我确信必须有一个标准的方法来做到这一点,但我搜索 Stackoverflow 的尝试失败了。

我有这样的方法:

public void processSomeWidgetsForUser(int userItemId) {
    Iterator<Widgets> iter = allWidgets.values().iterator();
    while(iter.hasNext()) {
        Widget thisWidget = iter.next();
        if (userItemId == -1 || thisWidget.getUsersItemId() == userItemId) {                 
             widget.process();
        }
    }
}

如您所见,-1 是一个“特殊值”,表示所有进程。这样做可以避免在另一个名为 processSomeWidgetsForAllUsers 的方法中重复循环代码。

但我不喜欢这样的特殊值,因为它们很容易被误用或误解,这正是我现在必须解决的情况(有人认为 -1 意味着其他东西)。

我只能想到两种方法来改善这一点。

  1. 有一个常量,包含 -1 称为 Widget.ALLWIDGETS 之类的东西,它至少是自记录的,但不会阻止代码使用 -1(例如,如果有人集成旧代码)
  2. 更改方法以获取要处理的所有用户 ID 的列表,该列表可以为空,但这在性能方面似乎不是很好(需要先检索所有用户 ID,然后循环删除。如果数字列表中的小部件在检索 id 和删除之间发生变化

有没有更好的办法?我确定我遗漏了一些明显的东西。

上面的代码略有改动,所以可能无法编译,但你应该明白要点。

4

4 回答 4

4

尽管有些多余,但一种相当简洁的自我记录方法可能是使用 3 种方法而不是 1 种方法;

制作您的原始方法private,并进行一个小的更改,即添加您的static final int EXECUTE_ALL = -1并在您的原始方法中使用它,然后添加两个新方法;

public void processWidget(int wID) throws IllegalArgumentException {
    if(wID == EXECUTE_ALL) throw new IllegalArgumentException();
    originalMethod(wID);
}

public void processAllWidgets() {
    originalMethod(EXECUTE_ALL);
}

它使您的课程更加混乱,但就公开的方法而言,它更加清晰并且希望万无一失。您可以更改它以不引发异常并忽略任何无效的 id,这取决于您的情况。

这种方法当然有一个主要的缺点,它改变了类对其他类的显示方式,破坏了当前使用的所有东西,现在是私有的 originalMethod()。

于 2012-12-07T18:10:18.900 回答
1

1 号会很好地工作。请务必记录变量是什么,以便未来的编码人员(可能是您自己)知道它的含义。

/**This is the explanation for the below variable*/
public final static int ALL_WIDGETS = -1;
于 2012-12-07T18:01:38.393 回答
1

有一个像这样的外部方法:

static boolean idRepresentsAll(int id) {
    return id == -1;
}

在这种情况下,如果您决定用不同的机制替换它,您只需将您的幻数替换为代码中的一个位置。

至少,你会想做这样的事情:

public static final int ID_REPRESENTING_ALL = -1;
于 2012-12-07T18:01:49.863 回答
1

您可以更改方法签名以在要处理所有这些时接受布尔值。

public void processSomeWidgets(boolean doAll, int userItemId) {
    Iterator<Widgets> iter = allWidgets.values().iterator();
    while(iter.hasNext()) {
        Widget thisWidget = iter.next();
        if (doAll || thisWidget.getUsersItemId() == userItemId) {                 
             widget.process();
        }
    }
}

在我看来,这使它更明确,更容易阅读,因为没有特殊值。

于 2012-12-07T18:14:46.267 回答