2010-06-03 109 views
60

C#屬性(我的意思是獲取和設置方法)是一個非常有用的功能。 java是否也有類似於C#屬性的東西。我的意思是,我們如何在Java的實現類似下面的C#代碼:java有一些類似於C#屬性的東西嗎?

public string Name 
{ 
    get 
    { 
     return name; 
    } 

    set 
    { 
     name = value; 
    } 
} 

預先感謝您

+2

見[吸氣劑/在Java setter方法](http://stackoverflow.com/questions/875033/getters-setters-in-java) – 2010-06-03 04:02:45

+0

另請參閱CodePorting C#2Java Cloud-App http://codeporting.com/blog/csharp-to-java-conversion/archive/2012/05/09/migrating-c-properties-to-java-using-codeporting- c2java.html在將C#代碼移植到java時自動將C#屬性轉換爲java。 – 2012-05-10 02:13:02

+0

實際上,你可以省略get和set前綴,並且像setter的getter和public void name(String val){...}那樣使用public String name(){...}。 「set」和「get」是常規的,但它非常明顯,當你寫name(「Lem」)並獲得String n = name(); – 2015-01-28 03:27:17

回答

68

沒有,Java不等價。它只有accessor和mutator方法,用於getter和setter方法的奇特名稱。例如:

public class User { 
    private String name; 

    public String getName() { return this.name; } 
    public void setName(String name) { this.name = name; } 
} 
+43

應該清楚的是,這些getter/setter方法不是單獨的結構,而是使用華麗的語法,如C#中的屬性。相反,它們只是我們碰巧命名的普通方法getName()和setName(),並按照約定而不是通過專用的語言結構作爲屬性來執行它們。 – 2010-06-03 04:08:09

+3

True,getName()是setName()純粹是按照慣例命名的。我們可以決定命名這些方法,例如,retrieveUserName()和assignUserName(),這就好了。這種慣例在Java中是慣用的,並且遵循Eclipse IDE之類的工具。 – 2010-06-03 04:14:38

+16

這不僅僅是一個約定。有一個規範要跟隨Java Bean和一個使它們有用的API。 http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html – 2010-06-03 05:01:40

3

您可以只聲明一個私有變量,然後手工編寫這些方法。但是,如果您使用的是Eclipse,則可以單擊一個變量,選擇「Source」和「Generate getters and setters」。這和C#屬性一樣方便。

+0

NetBeans也提供這樣的自動化方法生成 – Supuhstar 2015-08-05 20:59:13

+3

我不會說它和c#一樣方便,因爲我傾向於重命名屬性,而不是更新屬性的名稱,所以我必須更新兩個方法和一個變量; – redsolo 2015-09-03 09:11:11

24

你可以看看Project Lombok,因爲它試圖從編寫鍋爐板Java代碼中解脫出來。它可以讓你要麼使用@Getter和@Setter註解,這將提供getBlah()和setBlah()方法:

public class GetterSetterExample { 
    @Getter @Setter private int age = 10; 
} 

或者你也可以只使用@Data,它會自動實現你的hashCode(),等於(),toString()和getter方法,對非決賽領域制定者一起:我已經與該項目發現

@Data public class DataExample { 
    private String name; 
} 

問題,然而,這一切都有點巫術,它可以是倒胃口,並且你必須安裝一個eclipse(或者什麼)插件才能使自動編譯工作。

+10

還有一個問題是,如果你使用Lombok,那麼你不再編寫可移植的Java代碼。 C#:Thing.Number + = 1 的Java:Thing.setNumber(Thing.getNumber()+ 1) – 2010-07-07 18:05:20

13

屬性不僅方便以書面getterssetters封裝在一個單位而言,也是他們在該點提供了良好的語法的電話。

Window.Title = "New"; //which looks natural 

,同時用getterssetters它通常是

Window.setTitle("New"); 
+20

它做的是這樣一個增量更糟在語法上。 – 2013-09-12 06:18:16

+3

這不回答這個問題,而只是說明差異 – Supuhstar 2015-08-05 20:56:30

+0

那麼如果你只是在java中使用公共字段,那麼你就可以像在C#中那樣做Window.Title =「New」,而不需要屬性。我從來沒有在C#中理解過他們的觀點,但我仍然使用它們,因爲它們很方便。 – ozzy432836 2016-12-16 00:02:23

相關問題