在C#中,您可以以比其他语言更简单的方式创建getter/setter:
public int FooBar { get; set; }
Run Code Online (Sandbox Code Playgroud)
这将创建一个内部私有变量,您无法直接使用外部属性"FooBar"直接访问它.
我的问题是 - 你多久经常看到这种滥用?它似乎很有可能经常违反封装最佳实践.不要误解我的意思,我会酌情使用它,并为只读的只写类型的属性使用它的部分变体,但是你的代码库中的其他作者对它的不愉快经历是什么?
澄清:当私人变量合适时,滥用的预期定义确实会产生这样的属性.
我厌倦了在豆子里一直加入大量的吸气剂/杀菌剂.有没有一种简单的方法来使用注释来摆脱这种愚蠢的工作?或任何其他方式?第二个例子是我希望运行的简短版本,因为不需要封装我的成员(尽管在另一个上下文中它可能是必要的).在我的现实世界中,我必须访问大约15个类,每个类中有大约10个数据成员,这将产生300个无用的setter/getter.
示例TestPerson.java(有效):
public class TestPerson {
public String firstName;
public String lastName;
public TestPerson() {
firstName = "Hugo";
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
示例TestPerson.java(不起作用):
public class TestPerson {
public String firstName;
public String lastName;
public TestPerson() {
firstName = "Hugo";
}
}
Run Code Online (Sandbox Code Playgroud)
示例test.jsp
<jsp:useBean id="testperson" class="test.TestPerson" scope="request" />
<html>
<head><title>Test</title></head>
<body> …Run Code Online (Sandbox Code Playgroud) 如果你在grails项目中有一个域类,你也可以使用getter和setter来编写或读取它们.
例如,域类Book具有以下属性:
String author
Run Code Online (Sandbox Code Playgroud)
在控制器中你有一本书,你想为这本书设置作者:这可以直接访问属性,也可以使用getter和setter方法,尽管它们不在类中.
book.author = "Mike Miller"
book.setAuthor("Mike Miller")
Run Code Online (Sandbox Code Playgroud)
在groovy和grails中获取和设置属性的首选方法是什么?
我们可以使用属性名称找到setter方法名称吗?
我有一个动态生成的 map<propertyName,propertyValue>
通过使用map中的键(这是propertyName),我需要为object调用适当的setter方法并传递map中的值(即propertyValue).
class A {
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
Run Code Online (Sandbox Code Playgroud)
我的地图包含两个项目:
map<"name","jack">
map<"company","inteld">
Run Code Online (Sandbox Code Playgroud)
现在我正在迭代地图,当我从地图继续处理每个项目时,基于密钥(名称或公司),我需要调用类A的适当的setter方法,例如,对于第一项,我将名称作为键,因此需要调用新的A ().setName.
得到一个我遇到的问题
public class Student{
private String studentNumber;
private String studentName;
private double studentResult;
public Student (String aNumber, String aName){
setStudentNumber(aNumber);
setStudentName(aName);
setStudentResult(0);
}
// The standard getter and setter method are define here.
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中使用setter方法的目的是什么?并且使用setStudentResult(0),我们需要另一个实例变量吗?
更新: 此问题已经过修改,以使其更加清晰.下面的答案似乎反映出这种方法效果很好.希望这个问题可以帮助那些需要添加get或者添加set现有财产的人.
今天遇到一个问题,我需要get用a get和覆盖基类的-only属性set.目前的共识似乎是这是不可能的,但我认为我找到了一种方法.
一般的想法是创建一个new属性而不是直接override使用旧属性,然后我们通过调用新方法创建一个override旧get方法的桥接方法.
这是一些无法修改的任意预先存在的类型结构的代码.
public abstract class A
{
public abstract int X { get; }
}
public class B : A
{
public override int X { get { return 0; } }
}
Run Code Online (Sandbox Code Playgroud)
我们想编写这段代码,但不会编译.
public class C : B // won't compile: X can't have a 'set' method
{
private int _x;
public override int X …Run Code Online (Sandbox Code Playgroud) Java类中常见的有许多getter和setter方法,每个方法对应一个数据模型类变量.我意识到很多IDE会为你创建这些,但是我试图避免这种混乱,并且在我的课程中没有所有这些方法.那么,有没有办法以类外的只读方式访问变量(就好像它是公共最终的),同时保留了类或子类内的写访问权限(就好像它是私有的或受保护的).
我提出的唯一伪解决方案是基类(或具有默认方法的接口),它具有get(String variableName)方法,然后通过反射获取类的字段并返回适当的字段.缺点是,为了工作,变量必须是公共的,所以只有按照惯例它才符合我的要求(在扩展/实现类中有我想要访问的变量,我只调用get方法在类之外,并没有实现set方法).我不喜欢的主要问题是,如果变量名称发生变化,get方法的调用者将不会导致编译器错误,因为变量名称只是一个硬编码的String.
谁有更好的主意?
更具体地说,我想编写一个代码,IllegalArgumentException如果给定值为负,则抛出该代码.我应该在setter/constructor中包含此代码,还是应该在调用适当的方法时检查该值?(如:start(),init(),print()或run().无论)
我的代码(简化):
public class LLUAlgorithm {
private int temperature;
public int getTemperature() {
return temperature;
}
public void setTemperature(int temperature) {
if (temperature < 0)
throw new IllegalArgumentException("can't be smaller than 0.")
this.temperature = temperature;
}
public void run() {
...
}
Run Code Online (Sandbox Code Playgroud)
我不记得一个setter如上所述抛出异常的情况.但我很好奇它是好还是坏.
我知道如何将存储属性的"setter"设置为private(例如public private(set) var name: String = "John"),但是如何将计算属性的"setter"设置为private?在这种情况下,变量' age' 的'setter '.当我试图将关键字私有放在前面时set(newAge){},XCode会显示错误.那么可以将计算属性的"setter"设置为private吗?
public class Person {
public private(set) var name: String = "John"
var age: Int{
get {
return 10
}
set(newAge){ // how to set this setter to private so to restrict modification
}
}
}
Run Code Online (Sandbox Code Playgroud) 仍然习惯了Entity框架,但我已经看到了类似下面的代码,他们在Entity中拥有id的私有setter.
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
Run Code Online (Sandbox Code Playgroud)
为什么有些人会有私人制定者.这个Id字段无论如何都是在数据库中自动生成的,这是因为它设置为私有?
另外,为什么我们需要私有构造函数和公共构造函数,如下所示?
private Emp() { }
public Emp(string name, string lastname)
{
FirstName = firstname;
LastName = lastname;
}
Run Code Online (Sandbox Code Playgroud) setter ×10
getter ×7
java ×5
c# ×3
constructor ×2
oop ×2
reflection ×2
grails ×1
groovy ×1
methods ×1
overriding ×1
readonly ×1
swift ×1