具有一系列"instanceof"操作被认为是"代码味道".标准答案是"使用多态".在这种情况下我该怎么做?
基类有许多子类; 没有一个在我的控制之下.类似的情况是Java类Integer,Double,BigDecimal等.
if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);}
else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);}
else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);}
Run Code Online (Sandbox Code Playgroud)
我确实可以控制NumberStuff等等.
我不想在几行代码中使用多行代码.(有时我将一个HashMap映射到一个IntegerStuff的实例,将BigDecimal.class映射到一个BigDecimalStuff的实例等等.但是今天我想要一些更简单的东西.)
我想要像这样简单的东西:
public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }
Run Code Online (Sandbox Code Playgroud)
但是Java不会那样工作.
我想在格式化时使用静态方法.我正在格式化的东西是复合的,其中Thing1可以包含一个数组Thing2s和Thing2可以包含一个Thing1s数组.当我实现这样的格式化程序时,我遇到了问题:
class Thing1Formatter {
private static Thing2Formatter thing2Formatter = new Thing2Formatter();
public format(Thing thing) {
thing2Formatter.format(thing.innerThing2);
}
}
class Thing2Formatter {
private static Thing1Formatter thing1Formatter = new Thing1Formatter();
public format(Thing2 thing) {
thing1Formatter.format(thing.innerThing1);
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我知道HashMap和更多代码也可以修复它.但相比之下,"instanceof"似乎更具可读性和可维护性.有什么简单但不臭吗?
注释已添加5/10/2010:
事实证明,将来可能会添加新的子类,而我现有的代码必须优雅地处理它们.在这种情况下,类上的HashMap不起作用,因为找不到类.一系列if语句,从最具体的开始到以最一般的结尾,可能是最好的:
if (obj instanceof SubClass1) …
Run Code Online (Sandbox Code Playgroud) java reflection polymorphism instanceof chain-of-responsibility
看来,当您从浏览器中的脚本创建XMLHttpRequest时,如果浏览器设置为脱机工作或者拔出网络电缆,请求将以错误完成并且状态为0. 0未列为允许HTTP状态代码.
状态代码0是什么意思?所有浏览器和所有HTTP客户端实用程序的含义是否相同?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法进行HTTP请求,可能是因为服务器地址无法解析.
显示用户的错误消息是什么?"要么您没有连接到互联网,要么网站遇到问题,或者地址中可能存在输入错误"?
我应该补充一点,当我设置为"脱机工作"时,我会看到FireFox中的行为,但是当设置为"脱机工作"时,我看不到Microsoft Internet Explorer中的行为.在IE中,用户获得一个对话框,提供上线选项.FireFox在返回错误之前不会通知用户.
我问这是为了回应"显示更好的错误消息"的请求.Internet Explorer的功能很好.它告诉用户导致问题的原因并为他们提供修复问题的选项.为了给FireFox提供一个等效的UX,我需要推断出问题的原因并通知用户.那么总共可以从状态0推断出什么呢?它有普遍意义还是什么都没告诉我?
在使用HATEOAS设计RESTful Web服务时,将链接显示为完整URL(" http:// server:port/application/customers/1234 ")与仅路径("/ application /")的优缺点是什么?客户/ 1234" )?
在经典的"RESTful Web Services"一书中(O'Reilly,ISBN 978-0-596-52926-0),它在第251页上说"有些防火墙会阻止HTTP PUT和DELETE而不是POST".
这仍然是真的吗?
如果确实如此,我必须允许重载的POST替换DELETE.
跨站点请求伪造是否可以对抗无状态RESTful服务?
我不是在谈论伪REST,服务器会记住你是通过cookie登录的.我说的是没有cookie的纯无应用程序状态的服务器REST.
我正在使用SSL和基本身份验证.对于每个请求,该Authorization标头必须在那里.尽管在SSL级别存在某种会话,但JSP意义上没有"会话".
因此,我们假设我正在查看发出Ajax请求的合法网页,并且我会以某种方式转到同一选项卡或不同选项卡中的不同页面,并且该页面发出相同的Ajax请求.(我假设合法网页上没有恶意代码;这完全是另一回事,在这种情况下一切皆有可能.)
当第二个页面发出Ajax请求时,浏览器是否会放置相同的Authorization标头?也就是说,浏览器会说"哦,你想再去那里?嘿,我碰巧还有钥匙!"?
此外,恶意脚本无法执行xhr请求,然后在回调中从ioargs获取请求,获取Authorization标头并取消Base64的名称和密码?
我正在实现一个访问数据库的RESTful Web服务.对数据库中的实体进行版本控制以检测多个更新.例如,如果当前值是{"name":"Bill", "comment":"tinker", "version":3}
,如果一个用户PUT {"name":"Bill", "comment":"tailor", "version":3}
,请求将成功(200 OK)并且新值将是{"name":"Bill", "comment":"tailor", "version":4}
.如果第二个用户PUT {"name":"Bill", "comment":"sailor", "version":3"}
该请求将失败(409 Conflict),因为版本号不匹配.
存在非RESTful接口,因此无法更改数据库的设计.RESTful接口调用现有接口来处理检查版本的详细信息.
RESTful Web服务中的经验法则是尽可能遵循HTTP的详细信息.在这种情况下,在请求中使用条件头并且如果版本不匹配则返回412 Precondition Failed会更好吗?相应的标题似乎是If-Match.该头部采用ETag(实体标签),其可以是资源的当前状态的表示的散列.
如果我这样做,ETags将出于外表的缘故,因为版本仍然是我正在测试的真实的东西.
有什么理由我应该这样做,除了"让它更加RESTful",无论这意味着什么?
在我的RESTEasy应用程序中,我得到了一个java.lang.reflect.UndeclaredThrowableException
,因为从一个未在throws子句中声明异常的方法抛出了一个已检查的异常.
所以我正在写一篇文章UndeclaredThrowableExceptionMapper
.该UndeclaredThrowableException
包装的实际除外; 我打电话e.getCause()
来取回它.
我可以抛出它或以某种方式查找适当ExceptionMapper
的处理它吗?
是否有一种迭代颜色的好方法?我知道这听起来像一个奇怪的问题,但这是一个类比.
假设你写了一个你环游地球的游戏.您选择一个起点,然后定义重复应用的规则.例如:从地球上的当前位置开始,然后定义穿过您的位置以及北极和南极的大圆.每走一步,沿着这个圆圈行驶10英里.每一步都会带您进入与之前相似的气候(尽管有时候你会因为你在海洋中而非常潮湿).或者每步走6,000英里.现在每一步都是一个非常不同的气候.
现在想象一个用随机颜色在屏幕上绘制元素的程序.也许您将增量设置为较小的数字,每种颜色与之前的颜色非常相似.也许你把它设置得很高,每种颜色都与之前的颜色非常不同.
如果你使用RGB值并逐渐递增R,G和B,你会逐渐改变,直到其中一个值换行并且你会突然改变.
对于HSB值,色调的色域是圆形的,因此没有不连续性.S和B不是,你可能遇到一段难以区分的颜色,因为S太低而且看起来都很白.将S和B保持在最大值是可能的,尽管它留下了很多颜色.
程序的每次运行仅使用少量颜色(10到15).我想随意选择值,以便有一次颜色和谐地混合,一次它们发生冲突,一次它们都是粉彩,有一次它们是饱和和柔和的混合等.
仅限Java 5及以上版本.假设一个多处理器共享内存计算机(你现在可能正在使用它).
这是一个单例的延迟初始化代码:
public final class MySingleton {
private static MySingleton instance = null;
private MySingleton() { }
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
是否instance
必须声明volatile
,以阻止优化重写的getInstance()如下(这将是一个连续的程序是正确的):
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
// instance must be null or we wouldn't be here (WRONG!)
instance = new MySingleton(); …
Run Code Online (Sandbox Code Playgroud) 我不确定我是否可以信任Git自动合并.这是一个场景.
在master中创建一个程序:
MOVE 0 TO I.
A.
PERFORM X-PROC.
IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)
开发人员1创建了一个分支,并注意到存在一个错误:无限循环.他解决了这个问题:
MOVE 0 TO I.
A.
ADD 1 TO I.
PERFORM X-PROC.
IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)
与此同时,Developer 2创建了一个分支并以自己的方式修复了错误:
MOVE 0 TO I.
A.
PERFORM X-PROC.
ADD 1 TO I.
IF I IS EQUAL TO 25 THEN GO TO A.
Run Code Online (Sandbox Code Playgroud)
两位开发人员都会测试他们的代码并发现它 两者合并到主人:
MOVE 0 TO I.
A.
ADD 1 TO I.
PERFORM X-PROC.
ADD 1 TO …
Run Code Online (Sandbox Code Playgroud)