如何在Java中修剪其某些字段的对象?

时间:2015-12-15 03:37:29

标签: java oop composition

假设我们有obj类型的对象ObjectSystem.out.println(obj)生成{a=Some text, b=Some more text, c=Even more text}

现在我们想要创建一个仅obj2的新对象{a=Some text}(即bc字段从obj修剪。所以我们定义一个类A如下:

class A {
    String a;
}

然后我们按如下方式初始化obj2

A obj2 = (A) obj

不幸的是,我在执行此操作时遇到了运行时错误。

问题:我们如何定义obj2如上所述?

3 个答案:

答案 0 :(得分:1)

您获得例外的原因是obj仅属于Object类型;你不能神奇地"将其转换为A,使其适合obj2。在Java中,您只能将Object强制转换为已经的类型;你不能做出不属于AA的事情。相反,您必须手动复制属性,即将obj2.a设置为obj.a

分配obj2.a = obj.a的另一种方法是同时生成obj类型的obj2A,其中obj也是更具体的类型B。例如,假设您要按如下方式定义A类:

public class A {

    public String a = "Some text";

}

然后,您可以将B定义为:

public class B extends A {

    public String b = "Some more text";
    public String c = "Even more text";

}

最后,您可以这样创建对象:

B obj = new B();
A obj2 = obj;

System.out.println(obj2.a); // Prints "Some text"
System.out.println(obj2.b); // Throws an error

请注意,在第二种方法中,obj2 仍有属性bc;他们只是无法进入。

答案 1 :(得分:0)

在java中,每个对象都是Object。因此obj必须是Object。但这并不意味着obj只是Object。当然,如果您为System.out.println(obj)获得了一些可读结果,那么obj将从另一个类扩展。

它不是A类型,因为A a = (A)obj会出错。您可以使用以下命令查看obj的班级名称:

System.out.println(obj.getClass().getName());

我们假设obj来自班级B。有一些事情可以做你想做的事。

如果您可以更改B的定义,那么您可以extend从课程B {class} A。然后A a = (A)obj;就可以了。

class B extends A{
    ...
}

但如果您打印a,您将无法获得所需的输出。

您可以更改课程A

class A{
    private B b;
    public A(B b){
        this.b = b;
    }

    @Override
    public String toString() {
        return "{a=" + b.a + "}";
    }
}

然后你必须创建A a = new A(obj);。你不能这样做。但是如果你打印a,你将获得所需的输出。

希望这可能会有所帮助!!

答案 2 :(得分:0)

假设您在f1,f2,f3

中有三个字段class A

使用字段class B

创建新的f1

class A中声明一个像这样的方法

public B getTrimmedObject()

从A中设置B的必填字段。

e.g。 设置f1并返回B Object

Other way : use composition over inheritance。B将成为A的成员,您只需从A. In this case split fields between A and B and avoid duplication获得B.

f1将是B和B的一部分,f2,f3将成为A的一部分。构造函数将通过B和f2设置f1值,f3通过正常初始化设置

编辑:示例代码:

public class A{
    private B b;
    private String f2;
    private String f3;

    public A(String f1,String f2,String f3){
        b = new B(f1);
        this.f2 = f2;
        this.f3 = f3;
        System.out.println("In A->B:"+getB().getF1()+":A:f2:"+f2+":A:f3:"+f3);
    }
    public B getB(){
        return this.b;
    }
    public static void main(String args[]){
        if (args.length < 3) {
            System.out.println("Usage: java A str1 str2 str3");
            return;
        }
        A a = new A(args[0],args[1],args[2]);

    }

}
class B{
    private String f1;
    public B(String f1){
        this.f1 = f1;
    }
    public String getF1(){
        return this.f1;
    }
}



java A apple banana camel

 In A->B:apple:A:f2:banana:A:f3:camel