如何使变量指示另一个对象?

时间:2015-03-13 09:22:12

标签: java

我对这个问题没有更好的称号,你可以帮我改变它。

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()
  2. 它没有用。

    1. 我尝试将每个字段从b复制到
    2. 但方法getStr()并不总是返回真正的str,所以我可能需要创建另一个让我感觉不好的方法getTrueStr()

      1. clone()
      2. 让我感觉更糟。

        1. a = loadA(a);
        2. 这个很好。但我不是很喜欢它。因为我有其他loadB()loadC()并且他们不需要这种语法,它看起来只是不和谐。如果没有更好的解决方案,我选择这个。

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

          如果我在某个方法中获得了引用A a,那么如何在不使用clone()以及我上面写的内容的情况下将其与另一个对象相同。

2 个答案:

答案 0 :(得分:2)

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

据我了解,您希望创建对象b(类型为A),它是现有实例a的副本。

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

您可以创建“复制构造函数”,而不是使用JSON序列化程序或clone方法(根本不应该使用它 - 它有多个缺陷),

class A {

    private String str;

    public A() {}

    public A(A that) {
        this.str = that.str;
    }

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

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

}

答案 1 :(得分: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;
    }

}