以上就是给各位分享在Java中使用ENUMS验证值组合的最佳方法是什么?,其中也会对javaenum使用进行解释,同时本文还将给你拓展java–在Scala中格式化字符串的最佳方法是什么?、java–
以上就是给各位分享在Java中使用ENUMS验证值组合的最佳方法是什么?,其中也会对java enum使用进行解释,同时本文还将给你拓展java – 在Scala中格式化字符串的最佳方法是什么?、java – 在资源控制器中使用多个服务的最佳方法是什么?、perl – 用Moose做对象组合的最佳方法是什么?、php-使用多个验证器验证值的最佳(高效,逻辑)方法是什么?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- 在Java中使用ENUMS验证值组合的最佳方法是什么?(java enum使用)
- java – 在Scala中格式化字符串的最佳方法是什么?
- java – 在资源控制器中使用多个服务的最佳方法是什么?
- perl – 用Moose做对象组合的最佳方法是什么?
- php-使用多个验证器验证值的最佳(高效,逻辑)方法是什么?
在Java中使用ENUMS验证值组合的最佳方法是什么?(java enum使用)
我通过定义如下的ENUM来验证从数据库中检索到的记录的状态
public enum RecordStatusEnum { CREATED("CREATED"), INSERTED("INSERTED"), FAILED("FAILED");private String recordStatusValue; RecordStatusEnum (String status) { recordStatusValue= status; } public boolean isSuccess() { return (this.equals(CREATED) || this.equals(INSERTED)); }}
方法isSuccess()用于检查检索到的记录的状态(员工的列状态)
if (!(employee.getStatus().isSuccess())) { // return error }
根据新的要求,引入了一组条件,例如A,B和C。对于他们,在Employee表“ condition”中有一列。
因此,我需要检索状态以及条件,并查看它是否属于具有两者组合的集合。
例如:isSuccess()应该检查以下内容:
CREATED and A CREATED and BINSERTED and C
必须做到这一点,以使我很容易在列表中轻松地添加一个新的组合,例如“ INSERTED and B”。
解决上述问题的最佳方法是什么?
注意 :在实际的业务场景中,状态和检查要多得多(例如isFailed()canBeModified()等)以及许多不同的组合
即使不使用ENUMS,也可以建议使用任何方法。 我提到了ENUMS,因为我不想与现有的实现有很大的出入
答案1
小编典典有很多可能性,但是您可以这样做(我删除了String状态,因为它等于枚举的名称,所以不添加任何值):
public enum RecordStatusEnum { CREATED(Condition.A, Condition.B), INSERTED(Condition.C), FAILED(); private Set<Condition> successConditions; RecordStatusEnum(Condition... successConditions) { this.successConditions = EnumSet.copyOf(Arrays.asList(successConditions)); } public boolean isSuccess(Condition c) { return successConditions.contains(c); }}
编辑:
具有两组条件的示例:
public enum RecordStatusEnum { CREATED(EnumSet.of(Condition.A, Condition.B), EnumSet.of(Condition.C)), INSERTED(EnumSet.of(Condition.C), EnumSet.of(Condition.B), FAILED(EnumSet.noneOf(Condition.class), EnumSet.noneOf(Condition.class)); private Set<Condition> successConditions; private Set<Condition> modificationConditions; RecordStatusEnum(Set<Condition> successConditions, Set<Condition> modificationConditions) { this.successConditions = successConditions; this.modificationConditions = modificationConditions; } public boolean isSuccess(Condition c) { return successConditions.contains(c); } public boolean canBeModified(Condition c) { return modificationConditions.contains(c); }}
java – 在Scala中格式化字符串的最佳方法是什么?
解决方法
java – 在资源控制器中使用多个服务的最佳方法是什么?
我有一个控制器,可以调用三个服务:
public class ProductController(){
@Autowired
private AccountService accountService;
@Autowired
private ProcessService processService;
@Autowired
private releaseService releaseService;
@RequestMapping("/process")
public Product process(@RequestParam(value="name",defaultValue="docs") ProductProcessed process) {
accountService.notify();
releaseService.sendRelease(process);
return processService.process(process);
}
}
封装此服务调用的最佳方法是什么?
Facade基本上会在其中注入这3个服务,并封装您当前正在执行控制器的行为.这样,您将最小化业务逻辑,从而在控制器中调用粗粒度服务,从而进一步封装系统的内核.
perl – 用Moose做对象组合的最佳方法是什么?
从简单的“点”示例开始,我想构建一个“线” – 对象,由两个点组成,并具有长度属性,描述起点和终点之间的距离.
{ package Point; use Moose; has 'x' => ( isa => 'Int',is => 'rw' ); has 'y' => ( isa => 'Int',is => 'rw' ); } { package Line; use Moose; has 'start' => (isa => 'Point',is => 'rw',required => 1,); has 'end' => (isa => 'Point',); has 'length' => (isa => 'Num',is => 'ro',builder => '_length',lazy => 1,); sub _length { my $self = shift; my $dx = $self->end->x - $self->start->x; my $dy = $self->end->y - $self->start->y; return sqrt( $dx * $dx + $dy * $dy ); } } my $line = Line->new( start => Point->new( x => 1,y => 1 ),end => Point->new( x => 2,y => 2 ) ); my $len = $line->length;
上面的代码按预期工作.
现在我的问题:
>这是解决问题/做简单对象组合的最佳方法吗?
>是否有另一种方法来创建这样的行(示例不起作用!)(顺便说一句:其他方式确实存在?):
>
my $line2 = Line->new( start->x => 1,start->y => 1,y => 2 ) );
>如何更改坐标时触发长度的自动重新计算?或者,拥有像“长度”这样可以“轻松”从其他属性派生的属性是没有意义的吗?这些值(长度)应该更好地作为函数提供吗?
>
$line->end->x(3); $line->end->y(3); $len = $line->length;
>我怎样才能做出这样的事情呢?什么是一次改变点的方法 – 而不是改变每个坐标?
>
$line2->end(x => 3,y =>3);
谢谢你的回答!
解决方法
Is this the best way to solve the problem to do simple object
composition?
如果不知道你将要用它做什么,这太主观了,而且问题过于简单化了.但我可以说你正在做的事情没有错.
我所做的改变是移动工作来计算两点之间的距离为Point.然后其他人可以利用.
# How do I do something like this? my $line2 = Line->new( start->x => 1,y => 2 ) );
我要注意的第一件事是你不是通过前面的对象来节省很多打字……但就像我说这是一个简单的例子所以让我们假设使对象变得单调乏味.有很多方法可以获得你想要的东西,但一种方法是编写一个转换参数的BUILDARGS方法.手册中的示例有点奇怪,这是一个更常见的用法.
# Allow optional start_x,start_y,end_x and end_y. # Error checking is left as an exercise for the reader. sub BUILDARGS { my $class = shift; my %args = @_; if( $args{start_x} ) { $args{start} = Point->new( x => delete $args{start_x},y => delete $args{start_y} ); } if( $args{end_x} ) { $args{end} = Point->new( x => delete $args{end_x},y => delete $args{end_y} ); } return \%args; }
还有第二种方法可以使用类型强制来实现,在某些情况下更有意义.请参阅下面的$line2-> end(x => 3,y => 3)的答案.
How can I trigger an automatic recalculation of length when
coordinates are changed?
奇怪的是,有一个触发器!当该属性更改时,将调用属性上的触发器.正如@Ether指出的那样,你可以添加一个clearer到长度,然后触发器可以调用未设置的长度.这不违反只读的长度.
# You can specify two identical attributes at once has ['start','end'] => ( isa => 'Point',is => 'rw',required => 1,trigger => sub { return $_[0]->_clear_length; } ); has 'length' => ( isa => 'Num',is => 'ro',builder => '_build_length',# Unlike builder,Moose creates _clear_length() clearer => '_clear_length',lazy => 1 );
现在,无论何时设置开始或结束,它们都将清除长度值,使其在下次调用时重建.
这确实会出现问题……如果修改了开始和结束,长度会发生变化,但是如果使用$line-> start-> y(4)直接更改Point对象会怎么样?如果你的Point对象被另一段代码引用并且它们改变了怎么办?这些都不会导致长度重新计算.你有两个选择.首先是使长度完全动态,这可能是昂贵的.
第二种是将Point的属性声明为只读.您可以创建一个新对象,而不是更改对象.然后,它的值无法更改,您可以安全地根据它们缓存计算.逻辑延伸到Line和polygon等等.
这也让您有机会使用Flyweight模式.如果Point是只读的,那么每个坐标只需要一个对象. Point-> new成为工厂要么创建新对象要么返回现有对象.这可以节省大量内存.同样,这个逻辑延伸到Line和polygon等等.
是的,将长度作为属性是有意义的.虽然它可以从其他数据派生,但您希望缓存该计算.如果Moose有一种方法可以明确地声明长度纯粹是从开始和结束派生的,那么应该会自动缓存并重新计算,但事实并非如此.
How can I make something like this possible?
$line2->end(x => 3,y => 3);
实现这一目标的最不实用的方法是使用type coercion.
您定义了一个子类型,它将散列引用转换为Point.它的
最好在Point中定义它,而不是Line,以便其他类可以
使用积分时使用它.
use Moose::Util::TypeConstraints; subtype 'Point::OrHashRef',as 'Point'; coerce 'Point::OrHashRef',from 'HashRef',via { Point->new( x => $_->{x},y => $_->{y} ) };
然后将开始和结束的类型更改为Point :: OrHashRef并启用强制.
has 'start' => ( isa => 'Point::OrHashRef',coerce => 1,);
现在start,end和new将接受散列引用并将它们静默地转换为Point对象.
$line = Line->new( start => { x => 1,y => 1 },y => 2 ) ); $line->end({ x => 3,y => 3 ]);
它必须是散列引用,而不是散列,因为Moose属性只接受标量.
什么时候使用类型强制,什么时候使用BUILDARGS?一个好的
经验法则是如果参数新映射到属性,则使用类型
强迫.然后new和属性可以一致地执行,其他类可以使用该类型使其Point属性行为相同.
在这里,它们一起进行了一些测试.
{ package Point; use Moose; has 'x' => ( isa => 'Int',is => 'rw' ); has 'y' => ( isa => 'Int',is => 'rw' ); use Moose::Util::TypeConstraints; subtype 'Point::OrHashRef',as 'Point'; coerce 'Point::OrHashRef',y => $_->{y} ) }; sub distance { my $start = shift; my $end = shift; my $dx = $end->x - $start->x; my $dy = $end->y - $start->y; return sqrt( $dx * $dx + $dy * $dy ); } } { package Line; use Moose; # And the same for end has ['start','end'] => ( isa => 'Point::OrHashRef',trigger => sub { $_[0]->_clear_length(); return; } ); has 'length' => ( isa => 'Num',clearer => '_clear_length',lazy => 1,default => sub { return $_[0]->start->distance( $_[0]->end ); } ); } use Test::More; my $line = Line->new( start => { x => 1,end => Point->new( x => 2,y => 2 ) ); isa_ok $line,"Line"; isa_ok $line->start,"Point"; isa_ok $line->end,"Point"; like $line->length,qr/^1.4142135623731/; $line->end({ x => 3,y => 3 }); like $line->length,qr/^2.82842712474619/,"length is rederived"; done_testing;
php-使用多个验证器验证值的最佳(高效,逻辑)方法是什么?
这可能是一个菜鸟问题,但我不是专业的PHP开发人员,我想知道编写以下代码的最佳(高效,逻辑)方法是什么:
function validate_1 ( $input ) {
if ( mycondition ) {
return $input;
}
}
function validate_2 ( $input ) {
if ( myOtherCondition ) {
return $input;
}
}
function validate ( $input ) {
if ( validate_1( $input ) ) {
return validate_1( $input );
} else if ( validate_2( $input ) ) {
return validate_2( $input );
} else {
return validate_last( $input );
}
}
validate( 'a value' );
这样,我总是执行两次函数.那好还是有更好的方法(PHP> = 5.2)?
解决方法:
您可以尝试以下方法:
http://dsheiko.com/subpage/chain-of-responsibility-pattern
或使用类这样做:
abstract class Validator {
public function validate($args);
}
class Vali1 extends Validator {
public function validate($args){
#validate
return $bool;#true or false
}
}
class Vali2 extends Validator {
public function validate($args){
#validate
return $bool;#true or false
}
}
$validators = array(new Vali1,new Vali2);
$validated=null;
foreach($validators as $validator){
$validated = $validator->validate($args);
}
或具有功能:
$validators = array(
function($args) { retrun $bool;},
function($args) { retrun $bool;},
function($args) { retrun $bool;}
);
$validated=null;
foreach($validators as $validator){
$validated = $validator($args);
}
但这仅仅是基础.还有更多的罗马方式.
更新:
$count = count($validators);
$current = 0;
do{
$result = $validators[$current++]($args);
}while(!$result && $current < = $count);
然后在函数中返回$input或无效时返回NULL
今天关于在Java中使用ENUMS验证值组合的最佳方法是什么?和java enum使用的分享就到这里,希望大家有所收获,若想了解更多关于java – 在Scala中格式化字符串的最佳方法是什么?、java – 在资源控制器中使用多个服务的最佳方法是什么?、perl – 用Moose做对象组合的最佳方法是什么?、php-使用多个验证器验证值的最佳(高效,逻辑)方法是什么?等相关知识,可以在本站进行查询。
本文标签: