2017-08-06 91 views
0

我遇到了很多场景,您必须在需要与之交互的对象类型之间切换。并有自带的它们之间切换 1.使用的.class作为其标识符 2.使用一个枚举创建一个枚举或使用.class在java中的类型之间切换?

例如,如果我有一个网站的类型和予需要的类型之间切换2点的可能性。我可以创建枚举

enum WebsiteType { Blog, Shop } 

然后我们可以将这种类型传递给函数并在类型之间切换。或者,如果我们有个教学班,像

class Blog { } class Shop { } 

在这种情况下,同一个名字,我们还可以做

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

有什么更好的办法?

+1

我假设这些类是像形状 - >圆形和形状 - >三角形? – Steephen

+1

Enum常量应该是大写的,和其他泛型类型一样,'Class'永远不能用作原始类型。方法名称应该是camelCase。 – bcsb1001

+0

假设他们只是POJO,什么应该是正确的选择? –

回答

4

可能的方法是利用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); 
    } 
} 

通过这种方式,您委派多态性来决定基于动态类型执行哪个逻辑。如果你需要做一些特定于动态类型的逻辑,你实际上可以重构一些代码来使用双重调度。

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); 
    } 
} 

这将允许您避免任何形式的投射,因为分辨率将基于动态输入来完成,例如,纯粹使用实例的多态行为。

0

假设博客不包括任何逻辑本身,你可以,也许确实应该使用枚举作为其用于这样的情况。

但是,如果他们确实包含逻辑,那么很可能你会在面向对象的编程中使用继承和多态。 网站将是超级类和博客其子类。那么通常也不需要更换,但当然取决于你想要实现的目标。

例子:

public abstract class Website { 
    public abstract void doMyAction(); 
} 

public class Blog extends Website { 
    @Override 
    public void doMyAction() { 
    System.out.println("I'm a blog"); 
    } 
} 

public class Shop extends Website { 
    @Override 
    public void doMyAction() { 
    System.out.println("I'm a shop"); 
    } 
} 

然后,你可以创建实例,并调用它的方法不知道它的实际类型是这样的:

List<Website> sites = new ArrayList<>(); 
sites.add(new Blog()); 
sites.add(new Shop()); 

for (Website site : sites) { 
    site.doMyAction(); 
} 

在这种情况下,你可以让网站接口以及。