Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中删除属性及其值?_Java - Fatal编程技术网

如何在Java中删除属性及其值?

如何在Java中删除属性及其值?,java,Java,我对Java世界是如此陌生,所以请善待我 我有一个类具有以下属性: public class Test{ private long prop1; private long prop2; public long getProp1() { return prop1; } public void setProp1(long prop1) { this.prop

我对Java世界是如此陌生,所以请善待我

我有一个类具有以下属性:

public class Test{     
        private long prop1;

        private long prop2;

        public long getProp1() {
            return prop1;
        }

        public void setProp1(long prop1) {
            this.prop1= prop1;
        }

        public long getProp2() {
            return prop2;
        }

        public void setProp2(long prop2) {
            this.prop2 = prop2;
        }
}
现在,我在完成一些操作后,填充了类Test的对象,该对象将被发送到oData以进行保存。不知何故,我不想将prop2插入到将进入oData调用的字符串中,那么我如何才能删除prop2及其值呢


[prop1=1,prop2=2]

您需要一种为您详细说明的方法

一个选项是定义方法并根据需要打印属性

作为方向,您可以查看这个自动生成的toString方法

@Override
public String toString() {
    return "_Foo [prop1=" + prop1 + ", prop2=" + prop2 + "]";
}
移除(u Foo)部分就可以了

问题是我需要prop2直到一个级别才能执行某些操作,但我需要在oData调用之前移除它,这可能吗

我不知道。另外,我不知道oData,你的问题有点难以回答,因为你提供的信息很少。然而,基于上述评论,我将建议两件事:

方法#1:降低等级 换句话说,创建一个类似于
Test
的类,除去不需要的成员。在其构造函数中,复制提交的
Test
对象的每个其他成员,有效地创建一个可用于oData的副本:

Test test1 = new Test();
test1.setProp1(1337L);
test1.setProp2(1007L);

/* Do something with test1, including prop2 */

TestReduced test2 = new TestReduced(test1);

/* Do oData stuff with test2, no prop2 anymore */
这是一个非常复杂的解决方案,它要求您在
TestReduced
中镜像对
Test
的所有更改。一个通用的接口或一个抽象基类可以很好地保护这个过程,因此如果您这样做的话,我肯定会建议您安装一个。还应该考虑添加<强>私有构造函数< /强>,而不是用于<代码> TESTREST 的参数,以确保只能从<代码>测试< /代码>对象创建。或者,让
Test
类使用类似
getReducedInstance()
的方法创建
TestReduced
的实例,这将使
Test

方法2:成员地图 与其有两个成员,
prop1
prop2
,不如使用地图

public class Test {     
    private HashMap<String, Long> props = new HashMap<>();

    public Test() {
        props.put("prop1", 0L);
        props.put("prop2", 0L);
    }

    public void setProp1(long prop1) {
        props.put("prop1", p);
    }

    public void setProp2(long prop2) {
        props.put("prop2", p);
    }

    public long getProp1() {
        props.get("prop1");
    }

    public long getProp2() {
        props.get("prop2");
    }

    public void prepareForSerialization() {
        props.remove("prop2");
    }
}
公共类测试{
私有HashMap props=newhashmap();
公开考试(){
道具放置(“道具1”,0升);
放置道具(“道具2”,0升);
}
公共无效集合prop1(长prop1){
道具。推杆(“道具1”,p);
}
公共空间集合prop2(长prop2){
道具。推杆(“道具2”,p);
}
公共长getProp1(){
道具。获取(“道具1”);
}
公共长getProp2(){
道具。获取(“道具2”);
}
公开无效制备工业化(){
移除道具(“道具2”);
}
}
我不知道这对oData是否有效。但对于处理任意数量的属性来说,这无疑是一种非常灵活的方法。使用getter和setter,可以隐藏实现(
HashMap
vs.primitive-type memebers)。或者,如果愿意,可以通过提供诸如
getProp(字符串名称)
setProp(字符串名称,长值)
之类的方法向用户公开它。所有这些都是假设你所有的道具都是
long
类型



显然,如果您有两个用于序列化(?)的方法会更好,一个包含
prop1
,另一个不包含。但由于您明确表示需要删除一个成员,因此我想到了这一点。

我想您可能会有某种序列化程序(将数据更改为JSON、XML等)。通常,您可以指定哪些字段可用于序列化结果,哪些字段不可用于序列化结果。您需要包括如何序列化您的类,以便我们能够更好地提供帮助。如果这就是您发送数据的方式,那么在发送之前使用单独的方法并调用该方法可能会很有用。最坏的情况是,您可以使用类似的类而不使用prop2(
TestReduced
)它有一个构造函数,它接受一个
Test
对象,基本上复制除了prop2之外的所有内容。然后,只要需要prop2,您就可以使用
Test
对象,并在需要完成不应该接触到
prop2
的工作时,从中创建一个
TestReduced
。有点复杂,但它会完成工作。我们仍然需要知道序列化(?)是如何实际发生的。无论如何,我在上面的评论中做了一个回答,希望它适合你的情况。但事实上,更多的信息会很有帮助。你的第一个评论解决了我的问题,我创建了另一个类,它没有我不需要的属性。我已经在类本身中有了这个部分,问题是我需要prop2直到一个级别才能执行某些操作,但我需要在oData调用之前删除它,有可能吗?您可以在类中添加一个布尔值,
serializeProp2
,您可以通过某种方法
enableProp2(boolean enable){serializeProp2=enable;}
,然后在
toString()
中考虑该标志。谢谢您的帮助。
public class Test {     
    private HashMap<String, Long> props = new HashMap<>();

    public Test() {
        props.put("prop1", 0L);
        props.put("prop2", 0L);
    }

    public void setProp1(long prop1) {
        props.put("prop1", p);
    }

    public void setProp2(long prop2) {
        props.put("prop2", p);
    }

    public long getProp1() {
        props.get("prop1");
    }

    public long getProp2() {
        props.get("prop2");
    }

    public void prepareForSerialization() {
        props.remove("prop2");
    }
}