gpt4 book ai didi

java - instanceof 与 boolean 类型检查

转载 作者:行者123 更新时间:2023-12-02 06:00:38 25 4
gpt4 key购买 nike

我有一个名为 Section 和 MapSection 的接口(interface),它扩展了 section。我有一个 Sections 列表,如果它是一个 MapSection,我需要做一些额外的处理。我可以用两种方法来处理这个问题。我可以将 boolean 值 isAMapSection() 添加到 Section 接口(interface),但这会导致很多 isA.. 如果我添加更多类型。我能想到的另一种方法是 instanceof 检查,但我的 OOP 感觉认为这也不是很好。

curSection instanceof MapSection

哪一个是正确的方法?还是有别的办法?

最佳答案

如 Oliver Charlesworth 的评论所述,您可以使用 Visitor Design Pattern让您的代码根据所涉及的类型执行不同的操作,而不必使用一堆 instanceof 或类 equals。

例如,假设您有两个相似的接口(interface),Section 和 MapSection,其中 grins 将为 MapSection 提供一个额外的方法:

interface Section {
void someMethod();
void accept(SectionVisitor visitor);
}

interface MapSection extends Section {
void additionalProcessingMethod();
}

我们还将为 Section 提供 accept(...) 方法以允许 SectionVisitor 类型的访问者执行操作,其界面如下所示:

interface SectionVisitor {
void visit(Section section);
void visit(MapSection mapSection);
}

visit 方法将保 stub 据传入的类型知道要调用哪些方法的代码。

一个非常简单的具体示例如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class VisitorTest {
public static void main(String[] args) {
Random random = new Random();
List<Section> sectionList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Section section = random.nextBoolean() ? new ConcreteSection() : new ConcreteMapSection();
sectionList.add(section);
}

SectionVisitor visitor = new ConcreteSectionVisitor();
for (Section section : sectionList) {
section.accept(visitor);
}
}
}

interface Section {
void someMethod();
void accept(SectionVisitor visitor);
}

interface MapSection extends Section {
void additionalProcessingMethod();
}

interface SectionVisitor {
void visit(Section section);
void visit(MapSection mapSection);
}

class ConcreteSection implements Section {

@Override
public void someMethod() {
System.out.println("someMethod in ConcreteSection");
}

@Override
public void accept(SectionVisitor visitor) {
visitor.visit(this);
}

}

class ConcreteMapSection implements MapSection {

@Override
public void someMethod() {
System.out.println("someMethod in ConcreteMapSection");
}

@Override
public void additionalProcessingMethod() {
System.out.println("additionalProcessingMethod in ConcreteMapSection");
}

@Override
public void accept(SectionVisitor visitor) {
visitor.visit(this);
}

}

class ConcreteSectionVisitor implements SectionVisitor {

@Override
public void visit(Section section) {
section.someMethod();
}

@Override
public void visit(MapSection mapSection) {
mapSection.someMethod();
mapSection.additionalProcessingMethod();
}

}

关于java - instanceof 与 boolean 类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com