【问题标题】:How to drop property with its value in Java?如何在 Java 中删除属性及其值?
【发布时间】:2017-04-04 08:32:55
【问题描述】:

我对 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]

【问题讨论】:

  • 我想你会有某种序列化程序(它将数据更改为 JSON、XML 等)。通常,您可以指定哪些字段成为序列化结果,哪些不是。您需要说明您的课程是如何被序列化的,以便我们能够更好地提供帮助。
  • 如果这是您发送数据的方式,那么拥有一个单独的方法并在发送之前调用该方法可能会很有用。
  • 在最坏的情况下,您可以拥有一个没有 prop2 (TestReduced) 的类似类,该类具有一个构造函数,该构造函数采用 Test 对象并基本上复制 prop2 的所有内容。然后,只要您需要 prop2,您就可以使用您的 Test 对象,并在您需要做不应该与 prop2 联系的事情时创建一个 TestReduced 从它。有点复杂,但它会完成工作。
  • 我们仍然需要知道您的序列化(?)实际上是如何发生的。无论如何,我从上面的评论中做出了回答,希望它适合您的情况。但实际上,更多信息会有所帮助。
  • 您的第一条评论解决了我的问题,我创建了另一个没有我不需要的属性的类。

标签: java


【解决方案1】:

您将需要一种方法来为您详细说明,

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

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

@Override
public String toString() {
    return "_Foo [prop1=" + prop1 + ", prop2=" + prop2 + "]";
}

删除 _Foo 部分就可以了!

【讨论】:

  • 好吧,我已经在类本身中有这部分,问题是我需要 prop2 直到一个级别才能执行某些操作,但我需要在调用 oData 之前将其删除,这可能吗?
  • 你如何在你的类中添加一个布尔值,serializeProp2,你可以通过某种方法触发enableProp2(boolean enable) { serializeProp2 = enable; },然后在toString() 中考虑这个标志。
【解决方案2】:

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

我不知道。另外,我不知道 oData,而且您提供的信息很少,很难回答您的问题。但是,基于上述评论,我将提出两点建议:

方法 #1:精简类

public class Test {     
    private long prop1;
    private long prop2;

    /* getters, setters, ...*/
}

public class TestReduced {
    private long prop1;

    public TestReduced(Test test) {
        this.prop1 = test.getProp1();
    }

    /* getters, setters, ...*/
}

换句话说,创建一个类似于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。一个通用的interface 或一个abstract base class 可以很好地保护这个过程,所以如果你这样做的话,我肯定会推荐一个到位。您还应该考虑为TestReduced 添加一个不带参数的私有构造函数,以确保它们只能从Test 对象创建。或者,让Test 类使用getReducedInstance() 之类的方法创建TestReduced 的实例,这将使Test 成为factory

方法 #2:成员地图

不如使用地图而不是两个成员prop1prop2

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");
    }
}

这是否适用于 oData,我不知道。但这无疑是一种非常灵活的方式来处理任意数量的属性。使用您的 getter 和 setter,您可以隐藏实现(HashMap 与原始类型成员)。或者,如果您愿意,可以通过提供 getProp(String name)setProp(String name, long value) 等方法将其公开给用户。所有这一切都假设你所有的道具都是long类型的。


显然,如果您只有两种用于序列化 (?) 目的的方法会更好,一种包含 prop1,另一种不包含。但既然你明确表示你需要删除一个成员,这就是我想到的。

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
相关资源
最近更新 更多