2017-05-27 31 views
3

所以我一直在學習OOP。我正在嘗試用HP,Mana,智力,力量,敏捷,護甲等創建簡單的「英雄簡介」。正如你所看到的,我想添加許多屬性給Hero對象。但是這些屬性是私有的而不是公開的(因爲我被告知最好聲明這些屬性是私有的),並且當我私下聲明它們時,我必須爲這些屬性中的每一個形成集合並獲取方法。它消耗了很多時間,我覺得它不實用。當有很多屬性時,不使用set和get方法

有沒有更實用的方法?編碼器是否真的輸入了這些get和set方法,即使有十幾個這樣的方法?我想要做的就是創建兩個具有這些屬性的英雄檔案,然後模擬兩者之間的1v1戰鬥。

+0

Eclipse>右鍵單擊>源代碼>生成getter和setters>全選>完成 – Marvin

+0

哦,我正在使用IntelliJ。這個功能也有嗎? @Marvin – Huzo

回答

2

誰告訴你,該對象的單個屬性應該是私有的是絕對正確的

OOP的基本原理之一是Encapsulation。簡而言之,這意味着對象的內部結構(「字段」)應該隱藏起來。這是面向對象的最重要的方面,OOP的大多數優點都來自它。

現在,存取方法(getter和setter方法)破壞封裝,以同樣的方式只是讓他們做公衆,因爲你不再隱藏了內部結構。它不僅僅是保護內部字段,它是關於他們隱藏

不幸的是,accessor方法是Java(和C#)中常見的習慣用法,但如果你對於學習OOP非常認真,你應該不惜一切代價避免它們!後來,當你有更多的經驗時,你可能在少數情況下會例外,但我現在敦促你避開它們。避免項目龍目島,並避免IDE功能自動生成的東西。

Here是來自Allen Holub的關於這個問題的精彩文章。

回到你的實際問題:是的,你聲明你的字段是私人的,但你根本沒有爲他們定義setter/getters。我們所做的是考慮對象應該具備哪些職責/特徵/功能/邏輯。

因此,不要考慮統計數據,想想什麼你正在使用這些統計數據。面向對象的英雄可能是這樣的,那麼:

public final class Hero { 
    private int hp; 
    private int strength; 
    private int agility; 
    private int armor; 
    ... 

    public void dealDamageTo(Hero other) { 
     other.takeDamage(stength); 
    } 

    public void takeDamage(int damage) { 
     hp = hp - Math.max(0, damage-armor); 
    } 
    ... 
} 

當然,這只是一個例子,但你可能明白了吧。如果你的設計是正確的,根本不需要發佈內部字段。

+0

我明白了。非常有見地。非常感謝! – Huzo

1

是的,您應該編寫或生成getter和setter感謝您的IDE封裝您的字段,而不是一個良好的做法,當您更改時,您不必更改代碼中的get()和set()調用變量的名稱或類型(例如從Collection到List),它在java8中對使用lambda方法更加有用調用

另外,您的類正在管理其屬性,並且沒有人可以在其中更改其狀態不太方便的方式

+0

「是的,你應該編寫getters和setters」寫你的意思是實際上用手寫它們或讓編輯器爲我們生成它們? – Pshemo

+0

我的意思是讓編輯編寫它們,如果需要的話更改它們,當然生成它們會更快 –

+0

然後請使用[編輯]選項並澄清它,因爲它基於「而且消耗了太多時間」,它看起來像OP主要關注。 – Pshemo

2

在你的房產周圍設置吸塵器是非常重要的。否則,你打破封裝。

不幸的是,Java並沒有爲程序員聲明getter和setter提供一個合適的捷徑。但是,許多IDE確實爲您提供了生成訪問器方法的工具。

+0

謝謝!IJ是否提供了一個工具? – Huzo

+2

@Huzo是InteliJ [有此功能](https://www.jetbrains.com/help/idea/2017.1/generating-getters-and-setters.html) – dasblinkenlight

1

目前我想創建簡單的「英雄檔案」與HP,法力, 智力,力量,敏捷,裝甲等。正如你所看到的,有 很多屬性我想要添加到英雄對象。

看着這些線我可以說,在這裏你有繼承樹。你可以爲它們取一個父類,並在其中保存通用成員(變量和方法)。父類可以是interfaceabstract class或具體類。那麼你可以通過構造函數傳遞成員變量的值。

事實上,你認爲你有strength類,你有成員變量armStrength(作爲例子)。當你創建這個類的新實例時,你可以通過構造函數傳遞值。但後來手臂變得虛弱/破裂。在這種情況下,您需要更新armStrength

要做到這一點,你還需要一個setter方法。在OOP中擁有getter和setter是更好的選擇。由於封裝是OOP中的一個主要點。

爲了避免混亂時有很多的getter和setter你可以保留在一個單獨的類。

幸運的是,不要鍵入所有的getter和setter,你可以使用IDE快捷鍵來爲你創建基因。

  • 在Eclipse:Alt+Shift+S, R
  • 在NetBeans:Alt+Insert
  • 在的IntelliJ:ALT+Insert
相關問題