2017-06-21 54 views
-3

在Java中创建一个对象,比方说,我有2类: -哪个是更好的做法从另一个对象

class A { 
    int a; 
    int b; 
    String c; 
    String d; 
} 

class B { 
    int x; 
    int y; 
    String e; 
    String f; 
} 

现在,说我有A类即aObject的对象,我想创建一个B类对象,其中x对应于a,y对应于b等等。

所以,有2种方式,我通常看到的人做到这一点: -

1. B bObject = new B(aObject.geta(), aObject.getb(), aObject.getc(), aObject.getd()); 

其中一个构造函数在B中定义的所有参数从A

当值给出使用setter。

哪种方法更好?或者在某种情况下,每种方法都更有意义。

+0

大多数情况下,我会去与'构造函数'。如果不需要,我总是更喜欢没有setter,只有一个构造函数具有所有可能的字段以避免“半支持对象” – Mritunjay

回答

1

在这种情况下,我认为构造方法更好。使用构造函数,你有机会使你的B对象不可变。如果你和setter一起去,你将无法做到这一点。

如果AB非常密切的关系,尽量使B的构造函数接受A

public B(A a) { 
    x = a.getA(); 
    y = a.getB(); 
    e = a.getC(); 
    f = a.getD(); 
} 

而且,这是非常罕见的与对应于另一个属性在另一每个属性创建这些类类。如果AB都是你写的,你确定你没有做错什么?考虑删除其中的一个。如果其中一个不是由你写的,你为什么要创建一个完全复制另一个类的属性的类?你有没有考虑使用包装?

+0

这是我们在数据对象(从数据库中取一个)和响应对象(由API)。那么,对于这种情况,通常应该使用什么?我不认为在这种情况下,响应对象需要是不可变的。 – hatellla

+1

@hatellla在这种情况下,使用'A'作为参数的构造函数。我还建议你在'A'和'B'中添加诸如'ToResponseObject'和'ToDataObject'等方法。然后你用这些方法调用构造函数。这种方式我认为更具可读性。关于可变性,不可变对象通常是一个好习惯。尽可能做到这一点。 – Sweeper

+0

非常感谢您的建议和良好的推理。 – hatellla

1

您可以将A作为B的构造函数中的参数。

class B { 
    int x; 
    int y; 
    String e; 
    String f; 

    B(A aObject) { 
     x = aObject.geta(); 
     y = aObject.getb(); 
     e = aObject.getc(); 
     f = aObject.getd(); 
    } 
} 

然后,

B bObject = new B(aObject); 
-3

乙bObject =新B(aObject.geta(),aObject.getb(),aObject.getc(),aObject.getd()); ,这是最好的做法,以创建其他对象。

0

您可以通过Constructor链接做到这一点:

你应该使用inheritancesuper关键字到B类变量是指A级参数,如下面的代码:

class A { 
      int a; 
      int b; 
      String c; 
      String d; 

      public A(int a, int b, String c, String d) { 
       this.a = a; 
       this.b = b; 
       this.c = c; 
       this.d = d; 
      } 
     } 

     class B extends A{ 
      int x; 
      int y; 
      String e; 
      String f; 

      public B(int x, int y, String e, String f) { 
       super(x,y,e,f); 
//Above line call super class Constructor , Class A constructor . 
       this.x = x; 
       this.y = y; 
       this.e = e; 
       this.f = f; 

      } 
     } 

     A ARefrenceobjB = new B(1,2,"str1","str2"); 
相关问题