小编Mar*_*ton的帖子

在Java中避免使用instanceof

具有一系列"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

96
推荐指数
7
解决办法
7万
查看次数

HTTP状态代码0是否有任何意义?

看来,当您从浏览器中的脚本创建XMLHttpRequest时,如果浏览器设置为脱机工作或者拔出网络电缆,请求将以错误完成并且状态为0. 0未列为允许HTTP状态代码.

状态代码0是什么意思?所有浏览器和所有HTTP客户端实用程序的含义是否相同?它是HTTP规范的一部分还是其他协议规范的一部分?这似乎意味着根本无法进行HTTP请求,可能是因为服务器地址无法解析.

显示用户的错误消息是什么?"要么您没有连接到互联网,要么网站遇到问题,或者地址中可能存在输入错误"?

我应该补充一点,当我设置为"脱机工作"时,我会看到FireFox中的行为,但是当设置为"脱机工作"时,我看不到Microsoft Internet Explorer中的行为.在IE中,用户获得一个对话框,提供上线选项.FireFox在返回错误之前不会通知用户.

我问这是为了回应"显示更好的错误消息"的请求.Internet Explorer的功能很好.它告诉用户导致问题的原因并为他们提供修复问题的选项.为了给FireFox提供一个等效的UX,我需要推断出问题的原因并通知用户.那么总共可以从状态0推断出什么呢?它有普遍意义还是什么都没告诉我?

browser ajax http xmlhttprequest

89
推荐指数
4
解决办法
11万
查看次数

HATEOAS:绝对或相对URL?

在使用HATEOAS设计RESTful Web服务时,将链接显示为完整URL(" http:// server:port/application/customers/1234 ")与仅路径("/ application /")的优缺点是什么?客户/ 1234" )?

rest hateoas

77
推荐指数
6
解决办法
2万
查看次数

RESTful PUT和DELETE以及防火墙

在经典的"RESTful Web Services"一书中(O'Reilly,ISBN 978-0-596-52926-0),它在第251页上说"有些防火墙会阻止HTTP PUT和DELETE而不是POST".

这仍然是真的吗?

如果确实如此,我必须允许重载的POST替换DELETE.

rest firewall

21
推荐指数
1
解决办法
1万
查看次数

REST和CSRF(跨站点请求伪造)

跨站点请求伪造是否可以对抗无状态RESTful服务?

我不是在谈论伪REST,服务器会记住你是通过cookie登录的.我说的是没有cookie的纯无应用程序状态的服务器REST.

我正在使用SSL和基本身份验证.对于每个请求,该Authorization标头必须在那里.尽管在SSL级别存在某种会话,但JSP意义上没有"会话".

因此,我们假设我正在查看发出Ajax请求的合法网页,并且我会以某种方式转到同一选项卡或不同选项卡中的不同页面,并且该页面发出相同的Ajax请求.(我假设合法网页上没有恶意代码;这完全是另一回事,在这种情况下一切皆有可能.)

当第二个页面发出Ajax请求时,浏览器是否会放置相同的Authorization标头?也就是说,浏览器会说"哦,你想再去那里?嘿,我碰巧还有钥匙!"?

此外,恶意脚本无法执行xhr请求,然后在回调中从ioargs获取请求,获取Authorization标头并取消Base64的名称和密码?

security rest csrf

14
推荐指数
1
解决办法
6636
查看次数

HTTP状态412(前提条件失败)和数据库版本控制

我正在实现一个访问数据库的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",无论这意味着什么?

rest http http-status-code-412

11
推荐指数
1
解决办法
2万
查看次数

从JAX-RS中的另一个ExceptionMapper调用ExceptionMapper

在我的RESTEasy应用程序中,我得到了一个java.lang.reflect.UndeclaredThrowableException,因为从一个未在throws子句中声明异常的方法抛出了一个已检查的异常.
所以我正在写一篇文章UndeclaredThrowableExceptionMapper.该UndeclaredThrowableException包装的实际除外; 我打电话e.getCause()来取回它.
我可以抛出它或以某种方式查找适当ExceptionMapper的处理它吗?

jax-rs resteasy

8
推荐指数
1
解决办法
3748
查看次数

迭代颜色

是否有一种迭代颜色的好方法?我知道这听起来像一个奇怪的问题,但这是一个类比.

假设你写了一个你环游地球的游戏.您选择一个起点,然后定义重复应用的规则.例如:从地球上的当前位置开始,然后定义穿过您的位置以及北极和南极的大圆.每走一步,沿着这个圆圈行驶10英里.每一步都会带您进入与之前相似的气候(尽管有时候你会因为你在海洋中而非常潮湿).或者每步走6,000英里.现在每一步都是一个非常不同的气候.

现在想象一个用随机颜色在屏幕上绘制元素的程序.也许您将增量设置为较小的数字,每种颜色与之前的颜色非常相似.也许你把它设置得很高,每种颜色都与之前的颜色非常不同.

如果你使用RGB值并逐渐递增R,G和B,你会逐渐改变,直到其中一个值换行并且你会突然改变.

对于HSB值,色调的色域是圆形的,因此没有不连续性.S和B不是,你可能遇到一段难以区分的颜色,因为S太低而且看起来都很白.将S和B保持在最大值是可能的,尽管它留下了很多颜色.

程序的每次运行仅使用少量颜色(10到15).我想随意选择值,以便有一次颜色和谐地混合,一次它们发生冲突,一次它们都是粉彩,有一次它们是饱和和柔和的混合等.

rgb colors hsb

6
推荐指数
1
解决办法
3003
查看次数

Java synchronized关键字是否刷新缓存?

仅限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)

java volatile synchronized double-checked-locking

6
推荐指数
1
解决办法
2280
查看次数

我怎么能相信Git合并?

我不确定我是否可以信任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)

git merge

6
推荐指数
1
解决办法
1081
查看次数