Vraag Const-correctheid in Java met behulp van annotaties?


Is er een bestaande bibliotheek waarmee ik een Java-methode annoteer als @Const, zodat de compiler (met behulp van apt I veronderstelt) een fout markeert als deze een veld bijwerkt, of een niet-@ Const-methode op een veld aanroept; en annoteer een parameter als @Const, zodat de accepterende methode geen van de niet-@ Const-methoden kan aanroepen, of een van zijn velden kan bijwerken?

(Kortom, proberen const-correctheid aan Java toe te voegen met behulp van annotaties, er zijn enkele voor de hand liggende details die niet in de bovenstaande vraag worden behandeld, zoals toewijzen aan / van een @ Const-getypte parameter, etc.)

Ik heb dit gevonden: http://confluence.atlassian.com/pages/viewpage.action?pageId=182158080 maar het lijkt erop dat het alleen beschikbaar is als onderdeel van IDEA.

Na een verzoek om verduidelijking hieronder, hier is voorbeeldcode om te laten zien wat ik bedoel:

class Person {
  private String name;
  private String address;

  @Const public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  ... etc. for address
}

Nu, als ik een methode definieer zoals:

void processPerson(@Const Person p)

een regel zoals: p.getName() zou in orde zijn processPerson, sinds getName werd gemarkeerd als een @Const-methode. Maar bellen p.setName() van binnenuit processPerson zou worden gemarkeerd als een fout.

Merk op dat dit erg verschilt van final: als de parameter is gedefinieerd als final Person p, elke opdracht aan p zou illegaal zijn geweest, maar het is nog steeds perfect geldig om wat te wijzigen p verwijst naar (ofwel met p.setName(...) of nog meer direct, met p.name = ....


12
2018-02-06 09:29


oorsprong


antwoorden:


  • JSR-305 zogenaamd doet precies waar je naar op zoek bent

  • Persoonlijk zou ik zien of ik het kan gebruiken Hibernate Validator - Bean Validation (JSR-303) daarom. Het is een prachtige kleine lib (is niet afhankelijk van winterslaap, het is klein) en het doet wonderen om je gegevens schoon te houden. Zie de documentatie.

  • Er is ook een Google-gozer begonnen Contracten voor Java onlangs, maar het is misschien nog niet de productiekwaliteit.


8
2018-02-06 11:26



Bekijk de Checker Framework, dat in feite controllers heeft die softwarefouten proberen te detecteren [JSR-305] via een uitbreidbaar type annotatiesysteem [JSR-308].

Het heeft een onveranderlijkheidschecker (eigenlijk 2) waarmee je annotatiecode kunt annoteren met annotaties zoals @Mutable, @Imutable en @Readonly. Deze tool maakt onderscheid tussen een onveranderlijke instantie en een alleen-lezen verwijzing.

ik liefde dit framework en gebruiken het voornamelijk voor nulcontrole, maar ik probeer meer gebruik te maken van de immutability checker en interning checker.

een parameter annoteren als @Const, zodat de acceptatiemethode geen van de niet-@ Const-methoden kan gebruiken of een van zijn velden kan bijwerken?

Zou eruit zien als:

void addFriend(@ReadOnly Friend friend) { this.friends.add(friend); }

staat me toe om een ​​Java-methode te annoteren als @Const, zodat de compiler (met apt I veronderstelt) een fout markeert als deze een veld bijwerkt, of een niet-@ Const-methode op een veld aanroept; en

Het zou er zo uitzien voor het voorbeeld in de vraag:

public String getName(@ReadOnly Person this) {
  return name;
}

De @ReadOnly hier geeft de ontvanger aan (de this instantie waarvan de methode wordt aangeroepen) zou moeten NIET worden gewijzigd. Ondanks de schijnbare extra parameter, wordt de methode nog steeds als normaal genoemd:

@ReadOnly Person person = new Person();
person.getName();


6
2018-02-06 11:38



Ik stop @AlexR-commentaar, dit kan gedaan worden met AspectJ, iets in die zin:

public aspect ConstAspect{
declare warning : withincode(* *(..,@Const (*),.. ) ) : "Calling Const Method..";
}

Dit is niet correct voor uw vereisten, maar ik wil in principe een benadering weergeven. In het bovenstaande geval wordt elke methode met een @Const op een parameter getagd met een waarschuwing. Met een beter joinpunt kunnen alle zorgpunten worden getagd met een fout.


0
2018-02-06 12:50



const was in C ++. Java heeft het blijkbaar met de paplepel ingegoten. En nu groeien mensen op zonder echt ervaren te zijn const vind het een goed idee.

Zodra u een methode hebt gemarkeerd als const, het zal zich verspreiden als kanker, vrij snel zul je jezelf vinden const bijna alles. Het zou beter zijn geweest om een not-const.

Het is absoluut nutteloos. Het is alleen academisch aantrekkelijk, helpt niemand in echte programma's.


-4
2018-02-07 00:08