【问题标题】:Set custom class object's value with '=' operator in Java在 Java 中使用“=”运算符设置自定义类对象的值
【发布时间】:2013-08-22 17:09:50
【问题描述】:

我有一个自定义对象,它有一个 int 类型的值,我想对其进行处理以将该值保持在设定的范围内。我的问题是:给定下面的类,我可以用 myObject = 0 设置它的值吗;

public class foo{
    private int bar;
    public foo(){
    }
}

而不是创建一个方法 public void setBar()

【问题讨论】:

    标签: java custom-object


    【解决方案1】:

    如果你的意思是:

    foo x = new foo();
    x = 10; // This is meant to set x.bar
    

    那么不,你不能在 Java 中做到这一点。好东西,如果你问我……这在可读性方面会很糟糕。

    无法将其更改为允许:

    foo x = 10;
    

    相当于:

    foo x = new foo();
    x.bar = 10; // Or x.setBar(10);
    

    【讨论】:

    • 我认为使用矩阵会很好......但显然不适用于这个例子。
    • bar 的访问修饰符不是公开的,所以如果你想设置 x.bar 也必须改变它
    • @ShivaKumar:我原以为会是这样。虽然代码可以从同一个类中调用,当然:)
    • 不能再同意了。在我看来,可读性比 Java 中不可能重载运算符更重要。如果可能的话,我不建议这样做。
    • 就可读性而言,我本质上是在尝试创建一个自定义数据类型,其工作方式类似于具有范围约束的 int。在使用中,get/set 方法读起来会更好(我想要这个的全部理由)。我需要在设置值时运行一些代码以确保它在范围内,否则抛出异常(这个编码我已经完成了)。所以是的,它必须是私有的,除非(如下面的不同评论中所问)我能够监听要更改的公共值,以便可以自动调用私有方法来处理。
    【解决方案2】:

    不,你不能那样做。 Java 不支持运算符重载。尽管 + 运算符被重载以执行字符串连接,但这是唯一的例外。另一个使用= 运算符的示例是在包装类的情况下,您可以直接将原始类型值分配给其对应的包装类型,这会导致原始值自动装箱为包装类型。

    Integer val = 10;  // 10 is auto-boxed to Integer reference
    

    但仅限于此目的。您不能为自己的用户定义类型这样做。

    创建方法是您唯一的选择。

    【讨论】:

      【解决方案3】:

      Foo myObject = new Foo();

      这里,myObject 保存引用。您不能将原始值(例如 0)分配给对象引用。

      相反,您应该使用myObject.setBar(10);

      【讨论】:

        【解决方案4】:

        不,它违背了封装逻辑,也违背了 Java 本身。

        【讨论】:

          【解决方案5】:

          另一种可能性,您可以将此字段设为公开。它只需要在业务方法中进行您需要的验证(在设置期间不需要)。

          【讨论】:

          • 这是我考虑过的,但我的问题是,在构造函数内部,我可以在公共字段上放置某种监听器,以便我可以在它更改后立即进行一些处理而无需手动调用某种 .process() 方法?
          【解决方案6】:

          在 Java 中,约定是提供 setter 和 getter 来更改对象的内部属性。对于您的情况:

          foo instance = new foo();
          instance.setBar(10); //Sets bar to 10
          instance.getBar(); //returns bar's current value (right now 10)
          

          setter 接收新值并设置它:

          public void setBar(int newBar) {
              bar = newBar;
          }
          

          getter 可以访问该字段的当前值:

          public int getBar() {
              return bar;
          }
          

          但是,至少在 Java 中,您不能像 setBar 那样重载 = 运算符。如果您正在考虑,例如 IntegerFloat 包装类,那么还有另一种力量在起作用,它与 Java 的实现本身有关,后来衍生出 boxing 和 拆箱。

          【讨论】:

          • 你的意思是foo.setBar(10)instance.setBar(10)
          • 附带说明:请遵循 Java 的命名约定。类应以大写字母开头。
          猜你喜欢
          • 2020-05-14
          • 1970-01-01
          • 1970-01-01
          • 2021-05-11
          • 2012-07-22
          • 1970-01-01
          • 1970-01-01
          • 2021-10-07
          • 1970-01-01
          相关资源
          最近更新 更多