繁体   English   中英

Java-没有实例变量的访问器方法

[英]Java - Accessor methods without instance variables

语境

在Objective-C中进行编程时,我习惯于从不直接与实例变量进行交互。 相反,我使用的访问器方法将充当方法和实例变量之间的桥梁。 @property关键字和点表示法非常适合实现此目的,同时又保留了代码外观。 声明属性后,还将创建一个实例变量及其访问器方法。 我可以通过覆盖访问器方法来自定义任何行为或决定是否使用实例变量。

我最近开始尝试通过使用Lombok @Getter@Setter注释在Java中实现类似(不完全相同)的系统。 一切工作正常,但是有一个细微的细节困扰着我: 如果我想声明一个没有实例变量的只读属性,则不能声明该变量 这句话听起来很明显,但这是代码组织的问题:我希望能够在“属性”部分列出所有属性。

通过使用实际示例来解释这种情况可能会更容易。 这是Objective-C中的代码片段:

#pragma mark - Properties

@property (nonatomic, strong) Foo foo;
@property (nonatomic, strong) Bar bar;
@property (readonly) Baz baz;

#pragma mark - Getters / Setters

-(Bar)getBar {
    // Override bar getter. For example, perform lazy instantiation
    if(_bar == nil) {
        _bar = [[Bar alloc] init];
    }
    return _bar;
}
-(Baz)getBaz {
    // Override baz getter. For example, get baz from foo
    return self.foo.baz;
}

#pragma mark - Methods

-(void)doSomethingWithFooBarAndBaz {
    // Get log message
    NSString* logMessage = [NSString stringWithFormat:@"Foo: %@ Bar: %@ Baz: %@",
                                                      self.foo, self.bar, self.baz];
    // Log
    NSLog(logMessage);
}

我正在编写Java版本,如下所示:

@Accessors(prefix = "_")

...

// Properties

@Getter @Setter private Foo _foo;
@Setter private Bar _bar;
[THE PROBLEM IS HERE - I want to know that the baz property exists without
                       having to declare an instance variable for it]

// Getters / Setters

private Bar getBar() {
    // Implement bar getter. For example, perform lazy instantiation
    if(_bar == null) {
        _bar = new Bar();
    }
    return _bar;
}
private Baz getBaz() {
    // Implement baz getter. For example, get baz from foo
    return getFoo().getBaz();
}

// Methods

private void doSomethingWithFooBarAndBaz {
    // Get log message
    String logMessage = "Foo: " + getFoo().toString() + 
                       " Bar: " + getBar().toString() +
                       " Baz: " + getBaz().toString();
    // Log
    System.out.print(logMessage);
}

有没有办法做到这一点? 现在,我正在声明一个实例变量并对其进行注释,如下所示:

@Getter @Setter private Foo _foo;
@Setter private Bar _bar;
// private Baz _baz;

但这感觉不对。 我想知道是否有一个注释使实例变量在编译时和运行时不可用,从而使其仅具有信息性,因此我可以执行以下操作:

@Getter @Setter private Foo _foo;
@Setter private Bar _bar;
@[ANNOTATION] private Baz _baz;

有任何想法吗? 此外,这种方法是否违反任何Java最佳实践?

在Java中,您只能通过创建“ getter”方法来做到这一点,就像您在示例中所做的那样。

更好的做法是使用foo.getBaz()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM