JUG Milano - http://www.jugmilano.it/ Il canale di Gitter dedicato al JVM User Group
PathVsStringBenchmark.testPath avgt 10 0.481 ± 0.025 us/op PathVsStringBenchmark.testString avgt 10 0.004 ± 0.001 us/op
@felicepagano
da quello che ricordo la creazione di un'instanza di un oggetto non è un' operazione atomica
In realtà lo è (se almeno uno dei campi dell'instanza è final), ma relativamente a successive scritture: cioè se vi sono scritture successive di qualsiasi genere (magari facenti uso di dati dalla istanza appena creata) non possono essere percepite come antecedenti la creazione dell'istanza.
O meglio ancora:
x = new X();
y = x;
La scrittura y = x non può ricevere alcun valore corrotto di nessuno dei campti di x SE almeno uno di essi è final
allora ho una classe:
import io.atlassian.fugue.Either;
public class E1 {
public Either<Exception, String> example() {
return Either.right("");
}
}
e la estendo come:
import io.atlassian.fugue.Either;
public class E2 extends E1 {
@Override
public Either<String, Exception> example() {
return Either.left(new Exception());
}
}
notate che in E2 la signature del tipo di ritorno ha i generici invbertiti, e tutto cio' con mia enorme sorpresa compila
la dipendenza e':
<dependency>
<groupId>io.atlassian.fugue</groupId>
<artifactId>fugue</artifactId>
<version>4.7.1</version>
</dependency>
con interfacce e classi definite da me nonn riesco a riprodurre
il pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>example</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>io.atlassian.fugue</groupId>
<artifactId>fugue</artifactId>
<version>4.7.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
e mvn compile
javac MainFUgue.java -cp ~/.m2/repository/io/atlassian/fugue/fugue/4.7.1/fugue-4.7.1.jar
MainFUgue.java:23: error: example() in E2 cannot override example() in E1
public Either<String, Exception> example() {
^
return type Either<String,Exception> is not compatible with Either<Exception,String>
MainFUgue.java:22: error: method does not override or implement a method from a supertype
@Override
^
MainFUgue.java:24: error: incompatible types: inference variable L has incompatible bounds
return Either.left(new Exception());
^
equality constraints: String
lower bounds: Exception
where L,R are type-variables:
L extends Object declared in method <L,R>left(L)
R extends Object declared in method <L,R>left(L)
3 errors