2017-04-04 134 views
1

我對Java世界很新,所以請友好。如何使用Java中的值刪除屬性?

我有具有如下一些屬性一類:

public class Test{  
     private long prop1; 

     private long prop2; 

     public long getProp1() { 
      return prop1; 
     } 

     public void setProp1(long prop1) { 
      this.prop1= prop1; 
     } 

     public long getProp2() { 
      return prop2; 
     } 

     public void setProp2(long prop2) { 
      this.prop2 = prop2; 
     } 
} 

現在我一些手術後我已經填寫其將被髮送到的OData用於保存目的一流的試驗對象。不知何故,我不希望將prop2插入到將要進行oData調用的字符串中,那麼如何將prop2與其值一起放入?

[PROP1 = 1,PROP2 = 2]

+3

我會假設你會有某種序列化器(它將數據更改爲JSON,XML等)。通常你可以指定哪些字段使其成爲序列化結果,哪些不是。你需要包括你的班級如何被序列化,以便我們有更好的幫助。 – npinti

+0

如果這是您發送數據的方式,那麼在發送之前有一個單獨的方法並調用該方法可能會很有用。 – npinti

+0

最糟糕的情況是,如果沒有prop2('TestReduced'),您可以擁有一個類似的類,該類具有一個構造函數,該構造函數接受'Test'對象並基本上覆制* * prop2的所有內容。然後,只要你需要prop2,你就可以使用你的'Test'對象,並且一旦你需要做一些不應該接觸到'prop2'的東西,就從它創建'TestReduced' *。有點複雜,但它會完成工作。 – domsson

回答

1

事情是我需要prop2直到一個級別來執行一些操作,但我需要在oData調用之前將其刪除,是否有可能?

不是我所知道的。另外,我不知道oData,你的問題有點難以回答你提供的信息。然而,基於上述意見,我會建議兩兩件事:

方法一:減少類

public class Test {  
    private long prop1; 
    private long prop2; 

    /* getters, setters, ...*/ 
} 

public class TestReduced { 
    private long prop1; 

    public TestReduced(Test test) { 
     this.prop1 = test.getProp1(); 
    } 

    /* getters, setters, ...*/ 
} 

換句話說,創建一個類,類似於Test,棒材不需要會員。在它的構造中,手的所有其他成員複製Test對象,有效地創建一個可用於OData的副本:

Test test1 = new Test(); 
test1.setProp1(1337L); 
test1.setProp2(1007L); 

/* Do something with test1, including prop2 */ 

TestReduced test2 = new TestReduced(test1); 

/* Do oData stuff with test2, no prop2 anymore */ 

這是一個相當複雜的解決方案,它需要你所有的變化反映到TestTestReduced 。一個共同的接口抽象基類可以很好地保護這個過程,所以我肯定會建議,如果你這樣做,將一個到位。您還應該考慮添加一個專用構造函數而不帶參數TestReduced以確保只能從Test對象創建這些構造函數。或者,讓Test類使用getReducedInstance()等方法創建TestReduced的實例,這將使Test a factory

方法2:會員地圖

怎麼樣,而不是有兩個成員,prop1prop2,您可以使用地圖?

public class Test {  
    private HashMap<String, Long> props = new HashMap<>(); 

    public Test() { 
     props.put("prop1", 0L); 
     props.put("prop2", 0L); 
    } 

    public void setProp1(long prop1) { 
     props.put("prop1", p); 
    } 

    public void setProp2(long prop2) { 
     props.put("prop2", p); 
    } 

    public long getProp1() { 
     props.get("prop1"); 
    } 

    public long getProp2() { 
     props.get("prop2"); 
    } 

    public void prepareForSerialization() { 
     props.remove("prop2"); 
    } 
} 

這是否適用於oData,我不知道。但它肯定是處理任意數量屬性的一種非常靈活的方式。使用你的getter和setter,你可以隱藏實現(HashMap與原始類型memebers)。或者,如果您願意,可以通過提供諸如getProp(String name)setProp(String name, long value)等方法將其公開給用戶。所有這些假設你的道具都是long


顯然,這將是更好,如果你只是有你的序列化(?)的目的,一個包括prop1,一個不兩種方法。但是既然你明確表示你需要刪除的成員,這是我想到的。

+1

感謝您的幫助。 – Neel

2

你將來需要這種精心爲你一個方法,

一個選項可以定義一個方法,當你需要打印屬性...

可以爲導向,來看看這個自動生成的toString方法

@Override 
public String toString() { 
    return "_Foo [prop1=" + prop1 + ", prop2=" + prop2 + "]"; 
} 

刪除_Foo部分,有你!

+0

嗯,我已經在類本身的那部分,事情是我需要prop2,直到一個級別執行某些操作,但我需要在oData調用之前將其刪除,是嗎?可能? – Neel

+0

你怎麼樣爲你的類添加一個布爾值'serializeProp2',你可以通過'enableProp2(boolean enable){serializeProp2 = enable; },然後在'toString()'中考慮該標誌。 – domsson