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

时间:2016-03-01 22:28:25

标签: java objective-c lombok

上下文

在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最佳实践?

1 个答案:

答案 0 :(得分:0)

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

更好的实践是使用foo.getBaz()。