Java是否有整数、浮点、双精度、长型的可变类型?

Java是否有整数、浮点、双精度、长型的可变类型?,java,numbers,integer,mutable,built-in,Java,Numbers,Integer,Mutable,Built In,我所处的情况是,我想使用Integer之类的可变版本。我必须使用这些类(如下)还是Java内置了一些东西 您可以将值包装在数组中,如int[]mutable={1}如果包含可变包装类的代码太麻烦。不,Java没有内置这些。这是有原因的。使用可变类型是危险的,因为它们很容易被误用。此外,实现它非常容易。例如,commons lang有一个。您可以使用nnnn[]作为任何基元类型的可变对象,正如@Alexandre所建议的,java也有AtomicInteger和AtomicLong IMHO in

我所处的情况是,我想使用Integer之类的可变版本。我必须使用这些类(如下)还是Java内置了一些东西


您可以将值包装在数组中,如
int[]mutable={1}如果包含可变包装类的代码太麻烦。

不,Java没有内置这些。这是有原因的。使用可变类型是危险的,因为它们很容易被误用。此外,实现它非常容易。例如,commons lang有一个。

您可以使用nnnn[]作为任何基元类型的可变对象,正如@Alexandre所建议的,java也有AtomicInteger和AtomicLong

IMHO int通常是比Integer更好的选择,它是可变的


你能更详细地说明为什么需要一个mutliple对象吗?也许还有另一种方法可以实现同样的目的。

因为JDK1.5Java现在有
java.util.concurrent.atomic.AtomicInteger

这是一个线程安全的可变整数,使用示例:

final AtomicInteger value = new AtomicInteger(0);
随后:

value.incrementAndGet();

下面是我为可变整数创建的一个小类:

public class MutableInteger {
    private int value;
    public MutableInteger(int value) {
        this.value = value;
    }
    public void set(int value) {
        this.value = value;
    }
    public int intValue() {
        return value;
    }
}

您可以轻松地将其扩展到任何其他基本体。当然,正如其他人所说,您应该小心使用它。

您可以导入org.omg.CORBA包(或者只导入您需要的类),并在其中使用Holder类

例如,它有一个“IntHolder”,其中存储整数的字段是公共的,允许修改它

public static void triple(IntHolder x){
    x.value = 3 * x.value;
}

IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);     
System.out.println(mutableInt.value);
它还有“长支架”和“双支架”以及大量其他您可以使用的部件。小心使用


下面是它的api:

AtomicInteger
已经提到过。可变的
Double
s可以用
AtomicReference
进行仿真。前面提到的警告适用,这是一种不好的风格,但有时您会有这样的代码

double sum=0
for (Data data:someListGenerator())
  sum+=data.getValue()
并希望以功能性Java8风格对其进行重构。如果代码遵循此模式,但增加了相当多的复杂性,那么最明智的转换可能是

AtomicReference sumref=新的AtomicReference(0d);
someStreamGenerator().forEach(数据->
sumref.set(sumref.get().doubleValue()+data.getValue());
double sum=sumref.get().doubleValue();

当然,这至少是一种值得怀疑的风格。但我不止一次地发现自己在
ResultSet
上有一个扭曲的循环,计算并从中部分累积三种不同的信息。这使得将代码转换为适当的函数样式变得非常困难。在我看来,根据上述模式转换累积的部分似乎是干净代码和过于简化重构之间的合理折衷。

问题是,为什么要这样做?在某些情况下(例如,一个游戏,储存一块含有
n
卡路里的食物,可以消耗/增加热量),最好使用以使用命名的类(例如
class FoodItem{int carries;})
,因为它更清晰,如果以后需要,可以添加方法。Java 8 lambda只能有效地处理最终变量。要解决此限制,需要一个可变的int。您可能需要一个需要在方法之间传递的计数器。传递
int
不会像在一个方法中递增一样起作用,那么该值将不会增加不能反映在另一个方法中。
int
始终是可变的,除非它也是
final
说一个基元类型是可变的实际上是无效的。它可以更改,但是如果你只指向一个新对象,每个非final对象也可以更改。例如
整数a=4;
然后
a=5;
是有效的代码,但是
整数er
是不可变的。我同意
Integer
实例是不可变的,即使对它们的引用是可变的,但这是一种不同的类型。这不是一种使用reference int参数的好方法吗?例如,一个返回分页项目列表(从数据库中)的函数,还包括记录总数。在这种情况下,AtomicInteger或MutableInteger似乎很有用。当然,另一种方法是使用getTotalRecords属性,而不是在同一个方法中返回它。
int
是不可变的,因为如果将其传递给某个方法,该方法将无法更改其值并具有调用方法中反映的新值我猜是java开发人员希望整数像int一样“行为”,也就是说..一旦你有了对它的引用,它就永远不会改变(避免混淆)。但是..对我来说,没有可变选项似乎仍然很奇怪..“使用可变类型是危险的,因为它们很容易被误用。”大多数东西都可能被误用。不可变类型存在于安全性很重要的情况下,尽管它们可以通过反射进行更改。如果不考虑这些情况,就没有理由阻止人们在需要时使用可变类型。更好的说法是,不可变类型在地图和集合等方面造成的混乱更少。如果你有一个不可变类型le Integer并在用作键的位置更改其值,这会弄乱集合。但是,如果您需要Integer的可变实现,没有什么比创建包含int值的类更容易的了。并且您可以在其中发挥创造性-例如,使其成为计数器或倒计时,而不仅仅是启用任何功能的普通int。Giv将其转换为一些逻辑(除非您使用自底向上工作的JavaEE开发)。当然是个老问题,但希望有人能回答它们是如何被误用的。使用它们有什么危险?@user1175807正如Vlasec所评论的那样,如果你不小心修改了在其他地方使用的变量,它会导致奇怪的错误。更糟糕的是,假设你正在编写一个与客户端代码一起工作的程序。你需要实现一个具有可变整数类型参数的方法。现在,如果出于任何原因修改可变整数,那么它也会在客户端程序中更改,这是完全意外的,并且会导致
AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
  sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();