gpt4 book ai didi

java - 创建一个枚举或使用.class在java中的类型之间切换?

转载 作者:行者123 更新时间:2023-12-01 17:55:16 25 4
gpt4 key购买 nike

我遇到过很多场景,您必须在需要交互的对象类型之间进行切换。并且有两种在它们之间切换的可能性1.使用.class作为标识符2. 使用枚举

例如,如果我有一个网站类型,并且我需要在这些类型之间切换。我可以创建一个枚举

enum WebsiteType { Blog, Shop }

然后我们可以将此类型传递给函数并在类型之间进行切换。或者如果我们有同名的类,例如

class Blog { } class Shop { }

这样的话我们也可以这样做

void SwitchBetweenType(Class websiteType) {
switch(websiteType) {
case Blog.class:
break;
case Shop.class:
break;
}
}

更好的方法是什么?

最佳答案

可能的方法是利用 Visitor设计模式,例如

interface Website {
void doSomething(Platform platform)
}

class Blog extends Website {

public void doSomething(Platform platform) {
platform.doBlogTask();
}
}

class Shop extends Website {

public void doSomething(Platform platform) {
platform.doShopTask();
}
}

class Platform {

public doShopTask() {
// Put specific logic here
}

public doBlogTask() {
// Put specific logic here
}

void switchBetweenType(Website website) {
// Instead of switch-case using polymorphism.
website.doSomething(this);
}
}

通过这种方式,您可以委托(delegate)多态性来决定根据动态类型执行哪个逻辑。如果您需要执行一些特定于动态类型的逻辑,您实际上可以重构上面的代码以使用双重分派(dispatch)。

interface Website {
void doSomething(Platform platform)
}

class Blog extends Website {

public void doSomething(Platform platform) {
platform.doTask(this);
}
}

class Shop extends Website {

public void doSomething(Platform platform) {
platform.doTask(this);
}
}

class Platform {

public doTask(Shop shop) {
// Now you can work with shop variable
shop.payCart();
}

public doTask(Blog blog) {
// Now you can work with blog variable
blog.postEntry("New blog entry");
}

void switchBetweenType(Website website) {
// Instead of switch-case using polymorphism.
website.doSomething(this);
}
}

这将使您避免任何类型的转换,因为解析将基于动态类型完成,例如纯粹使用实例的多态行为。

关于java - 创建一个枚举或使用.class在java中的类型之间切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535685/

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