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

How to prune an object of some of its fields in Java?

假设我们有一个类型为 Object 的对象 obj,使得 System.out.println(obj) 产生 {a=Some text, b=Some more text, c=Even more text}.

现在我们要创建一个新对象 obj2,它只是 {a=Some text}(即字段 bc 被 p运行ed来自 obj)。所以我们定义一个classA如下:

class A {
    String a;
}

然后我们初始化obj2如下:

A obj2 = (A) obj.

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

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

你得到异常的原因是因为 obj 只是类型 Object;你不能 "magically" 把它变成一个 A 所以它适合 obj2。在 Java 中,您只能将对象转换为它 已经 的类型;你不能制作不是 AA 的东西。相反,您必须手动复制属性,即将 obj2.a 设置为 obj.a

分配 obj2.a = obj.a 的一种替代方法是使 objobj2 都成为 A 类型,其中 obj 也是更具体的类型 B .例如,假设您要定义 A class 如下:

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;它们只是无法访问。

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

扩展而来的

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

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

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

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

class B extends A{
    ...
}

但是如果你打印 a 你将得不到你想要的输出。

您可以更改 class 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 你会得到你想要的输出。

希望这对您有所帮助!!

假设您在 class A

中有三个字段 f1,f2,f3

使用字段 f1

创建一个新的 class B

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

public B getTrimmedObject()

根据 A 设置 B 的必填字段。

例如设置 f1 和 return B 对象

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

f1 将成为 B 的一部分,B、f2、f3 将成为 A 的一部分。构造函数将通过 B 设置 f1 值,而 f2、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