2015-03-13 87 views
0

我对这个问题没有更好的标题,你可以帮我改变它。如何使一个变量指示另一个对象?

class Example { 

    class A { 
     private String str; 

     public String getStr() { 
      return str==null ? "nothing" : str; 
     } 

     public void setStr(String str) { 
      this.str = str; 
     } 
    } 

    public static void main(String[] args) { 
     A a = null; 
     loadA(a); 
     System.out.println(a.getStr()); 
    } 

    private static void loadA(A a) { 
     // a = ****; 
     // in my project, a is load from a json string using Gson 
     // Gson cannot modify a Object, it can only create a new one, say b 
     // I tried to copy every field from b to a 
     // but the method getStr do not always return the true str 
     // so I may have to create another method "getTrueStr()" which feels bad 
    } 

} 

考虑解决方案和问题:

  1. a = Gson.createAnotherA()

它不工作。

  1. 我想每场从B复制到

getStr()并不总是返回真正的STR的方法,所以我可能要创建另一个方法getTrueStr()这让我感觉不好。

  • clone()
  • 让我感觉更糟糕。

    1. a = loadA(a);

    这一个很好。但我不喜欢它。因为我有其他loadB(),loadC(),他们不需要这种语法,它看起来不和谐。如果没有更好的解决方案出现,我会选择这一个。

    问题是,如果我不选择我给定的解决方案,我该怎么办?

    如果我给出的方法的参考A a,我怎么能让它,而不是使用clone()和我上面写的相同的另一个对象。

    +0

    你想* *一个方法来加载'A' *和*'B'的实例? – 2015-03-13 09:24:37

    +0

    @LutzHorn我不太了解你。 B 13 – bijiDango 2015-03-13 09:27:12

    +2

    也许你应该发出一个问题。你的问题没有一个单一的问题。你只是告诉我们你的感受。所以你想创建一个A类型对象的复制/克隆? – isnot2bad 2015-03-13 09:27:47

    回答

    0

    我这个就出来了。完全满足我的需求,看起来不错。

    类A {

    private A reference; 
    
        private String name; 
    
        public A() { 
         reference = this; 
        } 
    
        public void setReference(A ref) { 
         reference = ref; 
        } 
    
        public void setName(String name) { 
         reference.name = name; 
        } 
    
        public String getName() { 
         return reference.name; 
        } 
    
    } 
    
    2

    我认为你的问题真的在于你的getStr方法,它不是一个真正的getter,它包含了一些逻辑。是否有可能处理这个课外A

    据我所知,您要创建对象b(类型A),它是现有实例a的副本。

    因为a是从JSON加载的,所以您可以再次读取JSON,它应该创建一个新的实例。我想因为某种原因你不能这样做。

    而不是使用JSON序列化或clone方法(这不应该使用在所有 - 它具有多种缺陷),你可以创建一个“拷贝构造”:

    +0

    复制构造器很棒。我应该想到它。其实我不想像你说的那样“创造物体b”。事实上,我必须创建一个'b',然后使'a'有点像'b'的“副本”。 – bijiDango 2015-03-13 09:45:54

    +0

    我想过两次,不,你的解决方案不能胜任。如果我做了'a = new A(b)','main()'中的'a'不会更新到新对象,所以我不能打印它。 – bijiDango 2015-03-13 09:53:20

    +0

    对不起?我不明白。你是什​​么意思“它不会更新到新的对象”?你调用'new A(...)',把它分配给'a',所以'a'现在是一个新的实例。你想达到什么目的? – 2015-03-13 09:55:38

    相关问题