Java getter/setter字段方法的缩写形式

3

我想知道对象的getter/setter方法是否有缩写形式。

SimpleObject oSimple = new SimpleObject();
oSimple.setCounterValue(oSimple.getCounterValue() + 1);

就像用于简单数据类型的一个。

int counter = 0;
counter += 2;

信息

需要使用getter/setter方法。

附加说明

如果没有支持这种想法的语言特性,那么在良好和清晰的代码上下文中处理它的最方便方法是什么?


你可以在Scala中做到这一点,但在Java中不行。 - Arnaud Denoyelle
对于您的附加问题,lombok 可以避免您声明 getter 和 setter(这样您只需在 bean 中声明属性),但您仍然需要显式调用它们。 - Arnaud Denoyelle
如果您控制SimpleObject的源代码,可以添加一个“增量”方法,确保它是原子执行的。也许可以看一下AtomicInteger(以及它的兄弟姐妹们)。 - Fildor
递增仅是同类型变量在执行数值操作时传递的方式的示例。我对“SimpleObject”有控制权。还要提到,在setter/getter方法中可以发生逻辑操作。 - DanielK
当然,对于这样的便捷方法,必须考虑到这一点。 - Fildor
5个回答

3

我能想象你有C#背景 ;-)

在Java中这是不可能的(除了一些不完全相同的解决方案,例如具有公共属性等)。运算符重载也一样,它也可以解决您的问题。

但是,你可以看看http://www.eclipse.org/xtend/,它是一种类似于Java的JVM语言,支持运算符重载和其他一些聪明的东西。


我有一些,是的。我简直无法相信在Java中没有这么有用的东西。所以通常的方法是使用xtend JVM方言吗? - DanielK
我不认为这是正确的方法。如果您有自由选择,这只是要考虑的一个选项。对于我们大多数人来说,现实情况是这种方法并不可行。在我看来,递增方法是解决此具体问题的一种好方式。 - geert3
另外,这可能是一个有争议的话题,我不太喜欢 C# 的 getters/setters 伪装成属性的概念,除非是在非常特定的情况下。总体来说,它很容易让人混淆。在语言转换的上下文中,我会倾向于忽略它(以及运算符重载),例如将 COBOL 转换为 Java,在这种情况下,“+”需要执行更多操作而不仅仅是 Java 中的加法,或者您想要添加两个非本地类型。从概念上讲,它仍然是一个加号。 - geert3
对于我的情况,我担心无法迁移到 Xtend,因为运算符重载只是整个过程的一小部分,因此从普通 Java 切换到 Xtend 可能会太过繁重。而且,如果你在团队中工作,他们也必须学习这种方言。 - DanielK

1
如geert3所说,在Java中没有快捷方式来访问属性,必须直接访问。
在您的情况下,您的SimpleObject类应该只有一个方法increaseCounter(),也许还有increaseCounterBy(int add)(或简单地add(int a))。

我认为我会坚持使用 increaseCounterBy 的解决方案,因为它看起来是一个很好的权衡,既不使用 xtend,又能简单地显示后台正在进行自增。 - DanielK

1
对于这个案例,我创建了注释。
/**
 * Annotation for PropertiesContainer class (that has field without getter and setter)
 * This class look like as class with Properties in C#
 *
 */
public @interface PropertiesContainer {
}

添加add到任何类(注释表明这不是错误)

@PropertiesContainer // class without getter and setter 
public Class SomeObject{
     public int counter;
}

"只需使用:

"
oSimple.counter++;

0

如果在设置value时不需要检查任何错误值或执行代码,则可以直接引用变量来解决它:

public Class SomeObject{
     public int value;
}

public Class Main{

     public static void main(String[] args){
          SomeObject o = new SomeObject();
          o.value += 1;
     }
}

0
如果你所提供的示例是你想要做的全部(每次创建一个新对象时增加并分配索引),那么常见的做法是使用静态变量作为计数器和局部变量作为特定索引。
class SomeObject {

    static int objectCounter;
    private int index;

    public SomeObject() {
       index = objectCounter++;
       // additional constructor code
    }
}

如果你想要将一个数值加到一个变量上,我建议创建一个单独的方法来实现这个功能,而不是试图重写set()方法。或者,如果有意义的话,可以将它作为set()方法的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接