java 的sprintf_Sprintf相当于Java

FlySwat..

25

@erickson.

字符串是不可变类型.您无法修改它们,只返回新的字符串实例.

因此,"foo".format()没什么意义,因为它必须被称为

string newString = "foo".format();

最初的java作者(和.NET作者)认为静态方法在这种情况下更有意义,因为你没有修改"foo",而是调用格式方法并传入输入字符串.

编辑:嘿,这个网站有时可以很有趣.我因为提到字符串是不可变类型这一事实而被投票.

这是一个为什么Format()作为实例方法愚蠢的例子.在.NET中(可能在Java中),Replace()是一种实例方法.

你可以这样做:

"I Like Wine".Replace("Wine","Beer");

但是,没有任何反应,因为字符串是不可变的.替换尝试返回一个新字符串,但它被分配给任何内容.

这导致许多常见的菜鸟错误,如:

// Contrived Example

inputText.Replace(" ","%20");

再一次,没有任何反应,而你必须这样做:

inputText = inputText.Replace(" ","%20");

现在,如果您了解字符串是不可变的,那就非常有意义了.如果你不这样做,那你就困惑了.替换的正确位置是Format的位置,作为String的静态方法:

inputText = String.Replace(inputText," ", "%20");

现在毫无疑问,最新情况如何.

真正的问题是,为什么这些框架的作者决定一个应该是一个实例方法,另一个是静态的?在我看来,两者都更优雅地表达为静态方法,但erickson似乎认为它们都属于实例方法.

无论您的意见如何,事实是您不太容易使用静态版本出错,并且代码更容易理解(No Hidden Gotchas).

当然有一些方法是完美的实例方法,取String.Length()

int length = "123".Length();

在这种情况下,显而易见我们不是要修改"123",我们只是检查它,并返回它的长度......这是实例方法的完美候选.

我对不可变对象的实例方法的简单规则:

如果需要返回相同类型的新实例,请使用静态方法.

否则,请使用实例方法.

这个答案似乎与这个问题无关. (44认同)

我看到你以某种方式得到了我建议格式字符串被修改的想法.我从未考虑过某人可能期望改变String的可能性,因为他们的不变性是如此根本. (4认同)

看作格式字符串通常更像是"价格是%4d",而不是"%4d",我仍然看到很多混淆的可能性.你对静态方法有什么看法?:) (4认同)

-1.downvoted b/c它是切向的.并不一定是不可变的最佳风格.这种样式比简单的方法调用更冗长,特别是对于链式操作.它放弃了运行时多态性,因为它调用静态方法,这很重要.因人而异. (3认同)

答案甚至不是Java,似乎与.NET更相关 (2认同)

遵循你的逻辑.`"ABC".toLowerCase()`也是错的. (2认同)

解释为什么假定的`String.Format`应该是一个静态方法而不是一个实例方法没有*什么*来回答"什么是Java中sprintf的等价物?".(答案是"String.format",这是一个静态方法"btw.) (2认同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值