【发布时间】:2010-09-29 08:10:16
【问题描述】:
我使用了以下代码。
class Bike{
def manufacturer;
private getManufacturer(){
manufacturer
}
}
但我可以从另一个类调用 getter 方法。
【问题讨论】:
我使用了以下代码。
class Bike{
def manufacturer;
private getManufacturer(){
manufacturer
}
}
但我可以从另一个类调用 getter 方法。
【问题讨论】:
【讨论】:
我创建了一个编译器扩展,它允许您选择性地或全局地应用编译时检查是否违反封装。此外,您可以在编译时强制执行强类型检查和不变性检查。 https://github.com/stansonhealth/ast-framework
一个例子:
package com.stansonhealth.ast.encapsulate
import com.stansonhealth.ast.encapsulate.Encapsulate
@Encapsulate
class TestEncapsulationFixture {
private int i
}
class TestEncapsulation {
void foo(TestEncapsulationFixture fixture) {
fixture.i++
fixture[i]++
fixture.i = 0
def x = fixture.i
}
}
编译器输出:
startup failed:
TestEncapsulation: 14: Field or property "i" not accessible for class = com.stansonhealth.ast.encapsulate.TestEncapsulationFixture
@ line 14, column 21.
fixture.i++
^
TestEncapsulation: 15: Field or property "i" not accessible for class = com.stansonhealth.ast.encapsulate.TestEncapsulationFixture
@ line 15, column 21.
fixture[i]++
^
TestEncapsulation: 16: Field or property "i" not accessible for class = com.stansonhealth.ast.encapsulate.TestEncapsulationFixture
@ line 16, column 21.
fixture.i = 0
^
TestEncapsulation: 17: Field or property "i" not accessible for class = com.stansonhealth.ast.encapsulate.TestEncapsulationFixture
@ line 17, column 29.
def x = fixture.i
^
4 errors
【讨论】: