2015-08-08 41 views
0

標題聽起來像一個愚蠢的問題,但這是困擾我,我想不出一個簡潔的方式來說明。如何比較兩個項目unlocalized names

不管怎麼說,這裏是我使用的代碼:

public class OreSword extends ItemSword{ 

public OreSword(SWORDTYPES sword) 
{ 
    super(sword.getMaterial()); 
    setUnlocalizedName(RefStrings.MODID + "_" + sword.getName()); 
    setTextureName(RefStrings.MODID + ":" + sword.getName()); 
    //setCreativeTab(CreativeTabs.tabCombat); 
    sword.setSword(this); 
} 

public boolean hitEntity(ItemStack sword, EntityLivingBase target, EntityLivingBase self) 
{ 
    System.out.println("this is my override"); 
    sword.damageItem(1, self); 
    if(sword.getUnlocalizedName() == SWORDTYPES.COAL.getSword().getUnlocalizedName()) 
    { 
     System.out.println("this is my sword"); 
     target.setFire(100); 
    } 
    return true; 
} 

public static enum SWORDTYPES 
{ 
    COAL("CoalSword", 1, 131, 4.0F, 1.0F, 5), 
    DIAMOND("DiamondSword", 3, 1200, 8.0F, 3.0F, 30), 
    EMERALD("EmeraldSword", 3, 2300, 8.0F, 4.0F, 10), 
    GOLD("GoldSword", 0, 25, 10.0F, 1.0F, 12), 
    IRON("IronSword", 2, 131, 6.0F, 2.0F, 14), 
    LAPIS("LapisSword", 1, 131, 4.0F, 1.0F, 44), 
    QUARTZ("QuartzSword", 3, 131, 8.0F, 3.0F, 10), 
    REDSTONE("RedstoneSword", 2, 131, 6.0F, 2.0F, 14); 

    private String name; 
    /*private int hLevel; 
    private int mUse; 
    private float effic; 
    private float damage; 
    private int ench;*/ 
    private ToolMaterial mat; 
    private OreSword sword; 
    private SWORDTYPES(String name, int hLevel, int mUse, float effic, float damage, int ench) 
    { 
     this.name = name; 
     this.mat = EnumHelper.addToolMaterial(name, hLevel, mUse, effic, damage, ench); 
    } 
    public String getName(){return name;} 
    public ToolMaterial getMaterial(){return mat;} 
    public void setSword(OreSword sword){this.sword = sword;} 
    public OreSword getSword(){return sword;} 
} 
} 

當我運行這段代碼它輸出線「這是我重寫」,但它永遠不會打印出一行:「這是我的劍」

我在遊戲中測試的劍是正確的劍,我已經測試了這個創意,所以劍不會受到任何傷害,並且在劍的傷害下生存。 如果有人可以向我解釋我應該怎麼做來檢查項目,或者我可能在執行中缺少什麼,我將不勝感激。

+0

...爲什麼你在做你自己的對象非常昂貴的字符串比較? – Tschallacka

回答

1

在比較Java中的兩個字符串時始終使用public boolean equals(Object obj)

if(sword.getUnlocalizedName().equals(SWORDTYPES.COAL.getSword().getUnlocalizedName()))

而且,如果他們不等於一個好的技巧是嘗試,並打印出來,看看是什麼讓他們不公平,例如;

System.out.println("sword: " + sword.getUnlocalizedName()); System.out.println("SWORDTYPES: " + SWORDTYPES.COAL.getSword().getUnlocalizedName());

+0

這工作......困惑,爲什麼它的工作雖然... 字符串是相同的,所以爲什麼.equals()工作時,==不? – UberAffe

+0

@UberAffe - '=='不會比較字符串的內容。 –

+1

@UberAffe當一個對象存儲在內存中時,它獲得一個內存地址'0xAAAAA1'。第二個對象獲得'0xAAAAA2'等等......當你用'「abc def」實例化一個字符串時'java將首先查找它的字符串池,如果它存在並且使用它的內存地址訪問該字符串(查找字符串池)。 '「abc def」== new String(「abc def」)'將等同於'0xAAAAA1 == 0xAAAAA2',並且該測試將失敗。它們不是同一個對象。 ''abc def「==」abc def「'會通過,因爲它的'0xAAAA1 == 0xAAAA1',因爲它將字符串創建替換爲字符串池中的對象 – Tschallacka