2017-08-06 85 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(); 
} 

在這種情況下,你可以讓網站接口以及。