不带实例变量的Java访问器方法 上下文
在使用Objective-C编程时,我习惯于从不直接与实例变量交互。相反,我使用的访问器方法将充当方法和实例变量之间的桥梁。不带实例变量的Java访问器方法 上下文,java,objective-c,lombok,Java,Objective C,Lombok,在使用Objective-C编程时,我习惯于从不直接与实例变量交互。相反,我使用的访问器方法将充当方法和实例变量之间的桥梁。@property关键字和点表示法非常适合在保持代码外观的同时实现这一点。声明属性时,还将创建实例变量及其访问器方法。我可以通过重写访问器方法自定义任何行为或决定是否使用实例变量 我最近开始尝试用Java实现一个类似(不完全相同)的系统,方法是使用@Getter和@Setter注释。一切正常,但有一个小细节困扰着我:如果我想声明一个没有实例变量的只读属性,我不能声明变量。这
@property
关键字和点表示法非常适合在保持代码外观的同时实现这一点。声明属性时,还将创建实例变量及其访问器方法。我可以通过重写访问器方法自定义任何行为或决定是否使用实例变量
我最近开始尝试用Java实现一个类似(不完全相同)的系统,方法是使用@Getter
和@Setter
注释。一切正常,但有一个小细节困扰着我:如果我想声明一个没有实例变量的只读属性,我不能声明变量。这句话听起来很明显,但这是代码组织的问题:我希望能够在“属性”部分列出所有属性
例子
用一个实际的例子来解释这种情况可能更容易。以下是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;
但这感觉不对。我想知道是否有注释使实例变量在编译时和运行时不可用,从而使其纯粹是信息性的,所以我可以这样做:
@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()。这还不清楚。为什么您认为声明只读的
\u baz
,不应该只声明一个getter来完成?其值可能会在施工期间设定,或作为其他操作的副作用。这就是@property(只读)Baz Baz代码>完成了,那么@Getter private Baz_Baz有什么问题
?@JimGarrison在这种特殊情况下,每次调用getBaz()
getter(Swift universe中的计算属性)时,都应该计算baz
中的值,而不是缓存实例变量的结果。如果我写@Getter private Baz_Baz正如您所建议的,我将创建一个未使用的变量,因为在getter实现中不会使用_baz
。我不希望出现这种行为。只是想说明一下,在Objective-C中,声明一个只读属性(@property(readonly)Baz Baz
)并实现其getter(-(Baz)getBaz
)不会创建一个\u Baz
实例变量我不知道您正在使用哪个注释库,但为什么不能实现getBaz()
不声明实例变量吗?可以将注释应用到该方法吗?请考虑我以前的注释中的Objy-C示例(只读属性声明和GETter实现)。如果我删除属性声明,代码将以完全相同的方式工作。这是因为在本例中,属性声明仅提供信息。这就是我想要的:关于房产的信息。在Java中,如果我不声明实例变量,一切都会正常工作,但我无法直观地知道有属性,除非我检查所有getter,这不是我想要的。