我想知道在getter和setter或代码中的其他地方进行验证是否是个好主意.
在优化和加速代码方面,这可能会让您感到惊讶,我认为您不应该在getter和setter中进行验证,而应该在您更新文件或数据库的代码中进行验证.我错了吗?
我正在使用JAXB 2.0 JDK 6来将XML实例解组为POJO.
为了添加一些自定义验证,我已经将一个验证调用插入到属性的setter中,尽管它是私有的,但似乎unmarshaller不会调用setter但直接修改私有字段.
对我来说,每个unmarshall调用都会针对此特定字段进行自定义验证,这一点至关重要.
我该怎么办?
码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LegalParams", propOrder = {
"value"
})
public class LegalParams {
private static final Logger LOG = Logger.getLogger(LegalParams.class);
@XmlTransient
private LegalParamsValidator legalParamValidator;
public LegalParams() {
try {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
LegalParamsFactory legalParamsFactory = (LegalParamsFactory) webApplicationContext.getBean("legalParamsFactory");
HttpSession httpSession = SessionHolder.getInstance().get();
legalParamValidator = legalParamsFactory.newLegalParamsValidator(httpSession);
}
catch (LegalParamsException lpe) {
LOG.warn("Validator related error occurred while attempting to construct a new instance of LegalParams");
throw new IllegalStateException("LegalParams creation failure", lpe);
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 所以我在下面有一个Table对象的代码,它有一个fieldnames属性.
class Table(object):
'''A CSV backed SQL table.'''
@property
def fieldnames(self):
with open(self.filename) as f:
return csv.DictReader(f).fieldnames
@property.setter
def fieldnames(self, fieldnames):
with open(self.filename, 'w') as f:
dr = csv.reader(f)
dw = csv.DictWriter(f, fieldnames=fieldnames)
dw.writerow(dict((field, field) for field in fieldnames))
for row in self:
dw.writerow(row)
Run Code Online (Sandbox Code Playgroud)
当我尝试导入文件时,我收到错误:
seas486:PennAppSuite ceasarbautista$ python
Python 2.7.1 (r271:86832, Jun 25 2011, 05:09:01)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import table …Run Code Online (Sandbox Code Playgroud) 假设我们有一个带有'name'属性的类:
class SuperFoo(var name: String)
Run Code Online (Sandbox Code Playgroud)
如果我希望覆盖它,例如在调用周围添加一些锁定:
class SubFoo(n: String) extends SuperFoo(n) {
val lock = new ReentrantLock
override def name(): String =
{
lock.lock
try {
super.name
} finally {
lock.unlock
}
}
override def name_=(arg: String): Unit = {
lock.lock
try {
super.name = arg
} finally {
lock.unlock
}
}
}
Run Code Online (Sandbox Code Playgroud)
以上产生了编译错误:
super may be not be used on variable name
Run Code Online (Sandbox Code Playgroud)
任何想法如何正确实现这一点?(即覆盖getter和setter以在它们周围添加锁定).谢谢!
我对此完全感到困惑.我环顾四周,似乎找不到直接的答案.我有一个.proto文件,我的项目(全部是java)用来创建一些消息.
有一个重复的信息字段.这是我们创建的类型.当我使用protogen生成C#类时,此字段以只读方式显示,并且没有setter.
没有这个参数我无法完全构建消息.所以我的问题是.是否应该像这样生成重复字段,我应该以其他方式访问此只读列表?或者这是生成器中的错误?
生成的代码:
private readonly global::System.Collections.Generic.List<StringMapEntry> _factoryProperty = new global::System.Collections.Generic.List<StringMapEntry>();
[global::ProtoBuf.ProtoMember(2, Name=@"factoryProperty", DataFormat = global::ProtoBuf.DataFormat.Default)]
public global::System.Collections.Generic.List<StringMapEntry> factoryProperty
{
get { return _factoryProperty; }
}
Run Code Online (Sandbox Code Playgroud)
Proto文件部分:
repeated StringMapEntry factoryProperty = 2;
Run Code Online (Sandbox Code Playgroud)
我可能只是遗漏了一些非常明显的东西.谢谢你的帮助!
我试图在java中的另一个线程中访问和修改线程的变量,我真的不知道如何做到这一点.
例如:
Runnable r1 = new Runnable() {
int value = 10;
public void run() {
// random stuff
}
}
Runnable r2 = new Runnable() {
public void run() {
// of course the bellow line will not work
r1.value--; // I want here to be able to decrement the variable "value" of r1
}
}
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
Run Code Online (Sandbox Code Playgroud)
谢谢你,如果你有任何想法!
有没有办法在java中为线程创建一个getter和setter?
编辑:答案很好,但我不清楚我的问题,我会尝试提出一个更好的问题
我想在JS中创建一个使用本机getter和setter的类.我知道我可以为对象创建getter/setter,如下所示:
var obj = {
get value(){
return this._value;
},
set value(val){
this._value = val;
}
}
Run Code Online (Sandbox Code Playgroud)
我也知道我可以this.__defineGetter__在一个类/函数中使用,但是MDN说使用__defineGetter__()等是不合适的.
是否有更好的方法将getter和setter添加到js类中:
function class(){
};
class.prototype = {
get value(){
//....
}
Run Code Online (Sandbox Code Playgroud)
?
如何NSManagedObject在Swift中实现自定义setter .我需要在设置NSMangedObjectProperty 之前完成任务.
我熟悉Java,但刚刚开始学习JavaFX,并专门了解JavaFX属性.我理解Oracle的以下示例中显示的基本设计模式:
package propertydemo;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
class Bill {
// Define a variable to store the property
private DoubleProperty amountDue = new SimpleDoubleProperty();
// Define a getter for the property's value
public final double getAmountDue(){return amountDue.get();}
// Define a setter for the property's value
public final void setAmountDue(double value){amountDue.set(value);}
// Define a getter for the property itself
public DoubleProperty amountDueProperty() {return amountDue;}
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是何时/为什么我会使用getter和setter方法,而不是直接使用Property?
我在想的是你可能想要一些getter和/或setter中的自定义代码,它们可以对数据进行一些操作前/操作/验证,但是如果你创建一个自定义的getter和/或setter,你会得到不同的结果那么,取决于你是否直接使用getter/setter或属性,对我来说,这看起来很危险.
如果getter/setter只是调用Property的get和set方法,那么为什么要使用它们呢?
任何有关这方面的见解将不胜感激.
继例子这篇文章和它的后续问题,我试图创建一个使用编译表达式场getter/setter方法.
getter工作得很好,但是我被困在了setter中,因为我需要setter来分配任何类型的字段.
在这里我的setter-action builder:
public static Action<T1, T2> GetFieldSetter<T1, T2>(this FieldInfo fieldInfo) {
if (typeof(T1) != fieldInfo.DeclaringType && !typeof(T1).IsSubclassOf(fieldInfo.DeclaringType)) {
throw new ArgumentException();
}
ParameterExpression targetExp = Expression.Parameter(typeof(T1), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(T2), "value");
//
// Expression.Property can be used here as well
MemberExpression fieldExp = Expression.Field(targetExp, fieldInfo);
BinaryExpression assignExp = Expression.Assign(fieldExp, valueExp);
//
return Expression.Lambda<Action<T1, T2>> (assignExp, targetExp, valueExp).Compile();
}
Run Code Online (Sandbox Code Playgroud)
现在,我将通用setter存储到缓存列表中(当然,每次构建setter都是性能杀手),我将它们转换为简单的"对象":
// initialization of the setters dictionary
Dictionary<string, object> setters = new Dictionary(string, object)();
Dictionary<string, …Run Code Online (Sandbox Code Playgroud) setter ×10
getter ×4
java ×3
properties ×3
c# ×2
core-data ×1
decorator ×1
decrement ×1
fieldinfo ×1
inheritance ×1
ios ×1
javafx ×1
javascript ×1
jaxb ×1
optimization ×1
protobuf-net ×1
protogen ×1
python ×1
readonly ×1
reflection ×1
scala ×1
swift ×1
verification ×1